Derzeit entwerfe ich ein Domänenmodell für eine Anwendung. Ich habe ein einfaches Wertobjekt erstellt, das im Grunde genommen nur ein Wrapper um einen String ist, der mit einer Geschäftslogik versehen ist.Serialize Value-Objekt zu String im Frühjahr Daten REST
nun das Standardverhalten von Jackson ist das Objekt wie
"routerId": {
"routerId": "aa:aa:aa:aa:aa:aa"
}
für
@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)
}
}
}
ich stumbeld accross http://docs.spring.io/spring-data/rest/docs/2.6.3.RELEASE/reference/html/#_adding_custom_de_serializers_to_jackson_s_objectmapper zu machen und versuchte, meinen benutzerdefinierten jackson Modul zu handhaben Serialisierung mit
zu liefernclass 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)
}
}
und
@Configuration
open class SpringDataRestConfiguration : RepositoryRestConfigurerAdapter() {
override fun configureJacksonObjectMapper(objectMapper: ObjectMapper?) {
objectMapper?.registerModule(NicemediaModule())
}
}
aber dies führt nur zu
"routerId": {
"content": "aa:aa:aa:aa:aa:aa"
}
Könnte jemand darauf hinweisen, was würde ich die RouterId
nur zu einem einfachen String wie "routerId": "aa:aa:aa:aa:aa:aa"
Serialisierung zu tun haben, zu?
Edit: Ich habe @Component
meine SimpleModule
so dass Frühling Stiefel lädt sie standardmäßig aktiviert und schrieb einen litte Test, wenn die ObjectMapper
Werke zu sehen.
@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)))
}
}
funktioniert ganz gut. Dies kann ein Hinweis darauf sein, dass mein Code die ganze Zeit funktioniert, aber Spring Data REST kann mein Modell irgendwann nicht serialisieren.
Ja, ich habe schon darüber nachgedacht. Während dies das Problem in diesem einfachen Fall lösen könnte, wäre es schön zu wissen, wie ich das trotzdem mit komplexen Objekten lösen würde. – kschlesselmann
Das nächste Problem wäre, dass 'String' nicht' offen' ist ;-) – kschlesselmann