【发布时间】:2017-10-29 18:51:00
【问题描述】:
目前我正在为应用程序设计域模型。我创建了一个简单的值对象,它基本上只是一个用一些业务逻辑增强的字符串的包装器。
现在jackson的默认行为是像这样渲染对象
"routerId": {
"routerId": "aa:aa:aa:aa:aa:aa"
}
为
@Embeddable
data class RouterId(val routerId: String) {
init {
val octets = routerId.split(":")
if (octets.size != 6) {
throw IllegalArgumentException("$routerId does not consist of 6 octets")
}
for (octet in octets) {
Integer.parseInt(octet, 16)
}
}
}
我遇到了http://docs.spring.io/spring-data/rest/docs/2.6.3.RELEASE/reference/html/#_adding_custom_de_serializers_to_jackson_s_objectmapper,并试图提供我的自定义杰克逊模块来处理序列化
class NicemediaModule : SimpleModule("NicemediaModule") {
override fun setupModule(context: SetupContext?) {
val serializers = SimpleSerializers()
serializers.addSerializer(RouterId::class.java, RouterIdSerializer())
context?.addSerializers(serializers)
}
}
private class RouterIdSerializer : StdSerializer<RouterId>(RouterId::class.java) {
override fun serialize(value: RouterId?, gen: JsonGenerator?, provider: SerializerProvider?) {
gen?.writeString(value?.routerId)
}
}
和
@Configuration
open class SpringDataRestConfiguration : RepositoryRestConfigurerAdapter() {
override fun configureJacksonObjectMapper(objectMapper: ObjectMapper?) {
objectMapper?.registerModule(NicemediaModule())
}
}
但这只会导致
"routerId": {
"content": "aa:aa:aa:aa:aa:aa"
}
谁能指出我需要做什么才能将RouterId 序列化为像"routerId": "aa:aa:aa:aa:aa:aa" 这样的普通字符串?
编辑:
我将@Component 添加到我的SimpleModule 中,以便Spring Boot 默认加载它并编写一个小测试以查看ObjectMapper 是否有效。
@SpringBootTest
@RunWith(SpringRunner::class)
class JsonSerializationTest {
@Autowired
private lateinit var mapper: ObjectMapper
@Test
fun serializeRouterId() {
val routerId: String = "11:11:11:11:11:11"
assertEquals("\"$routerId\"", mapper.writeValueAsString(RouterId(routerId)))
}
}
工作得很好。这可能表明我的代码一直在工作,但 Spring Data REST 在某些时候无法序列化我的模型。
【问题讨论】:
标签: json jackson spring-data-rest