1
当前我正在为应用程序设计一个域模型。我创建了一个简单的值对象,它基本上只是一个包含用某些业务逻辑增强的字符串的包装。序列化值对象在Spring数据REST中串起
现在杰克逊的默认行为是使像
"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)
}
}
}
我stumbeld翻过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)
}
}
and
@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
让春天的引导加载它在默认情况下,写了豆蔻测试,看看是否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在某些时候无法序列化我的模型。
是的,我已经为此感到高兴。虽然这可能会解决这个简单情况下的问题,但我很高兴知道如何使用复杂对象解决此问题。 – kschlesselmann
接下来的问题是,'String'不是'open' ;-) – kschlesselmann