目前我正在为应用程序设计域模型。我创建了一个简单的值对象,它基本上只是一个用一些业务逻辑增强的字符串的包装器。
现在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并试图提供我的自定义jackson模块来处理序列化
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默认加载它并编写一个litte测试以查看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在某些时候无法序列化我的模型。
答案 0 :(得分:0)
让class RouterId
继承String
?
答案 1 :(得分:0)
尝试按this答案中的建议实施自定义BackendIdConverter
SPI。像魅力一样工作!