Json 在Spring数据REST中将值对象序列化为字符串

Json 在Spring数据REST中将值对象序列化为字符串,json,jackson,spring-data-rest,Json,Jackson,Spring Data Rest,目前我正在为一个应用程序设计一个域模型。我创建了一个简单的值对象,它基本上只是一个用一些业务逻辑增强的字符串包装器 现在jackson的默认行为是将对象渲染为 "routerId": { "routerId": "aa:aa:aa:aa:aa:aa" } 为了 我stumbeld accross并试图提供我的定制jackson模块来处理序列化 class NicemediaModule : SimpleModule("NicemediaModule") { override

目前我正在为一个应用程序设计一个域模型。我创建了一个简单的值对象,它基本上只是一个用一些业务逻辑增强的字符串包装器

现在jackson的默认行为是将对象渲染为

"routerId": {
    "routerId": "aa:aa:aa:aa:aa:aa"
}
为了

我stumbeld accross并试图提供我的定制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)
    }
}
但这只会导致

"routerId": {
    "content": "aa:aa:aa:aa:aa:aa"
}
有谁能指出我需要做什么才能将
RouterId
序列化为一个普通字符串,比如
“RouterId”:“aa:aa:aa:aa:aa”

编辑: 我在我的
SimpleModule
中添加了
@Component
,以便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在某个时候未能序列化我的模型。

类RouterId
字符串继承怎么样?

尝试实现一个自定义
后端IDConverter
SPI,如回答中所建议的那样。工作起来很有魅力

是的,我已经考虑过了。虽然在这种简单的情况下,这可能会解决问题,但如果知道如何使用复杂对象解决这个问题,那就太好了。下一个问题是,
String
不是
open
;-)
"routerId": {
    "content": "aa:aa:aa:aa:aa:aa"
}
@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)))
    }
}