2017-05-29 2 views
1

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 liefern
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) 
    } 
} 

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.

Antwort

0

Wie wäre es mit class RouterId erben von String?

+0

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

+0

Das nächste Problem wäre, dass 'String' nicht' offen' ist ;-) – kschlesselmann

Verwandte Themen