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