Actuellement, je conçois un modèle de domaine pour une application. J'ai créé un objet de valeur simple qui est simplement un wrapper autour d'une chaîne enrichie d'une logique métier.Sérialiser l'objet de valeur à la chaîne dans les données de ressort REST
Maintenant, le comportement par défaut de jackson est de rendre l'objet comme
"routerId": {
"routerId": "aa:aa:aa:aa:aa:aa"
}
pour
@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)
}
}
}
Je stumbeld accross http://docs.spring.io/spring-data/rest/docs/2.6.3.RELEASE/reference/html/#_adding_custom_de_serializers_to_jackson_s_objectmapper et essayé de fournir mon module jackson personnalisé pour gérer la sérialisation avec
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)
}
}
et
@Configuration
open class SpringDataRestConfiguration : RepositoryRestConfigurerAdapter() {
override fun configureJacksonObjectMapper(objectMapper: ObjectMapper?) {
objectMapper?.registerModule(NicemediaModule())
}
}
mais cela conduit seulement à
"routerId": {
"content": "aa:aa:aa:aa:aa:aa"
}
Quelqu'un pourrait-il indiquer ce que je dois faire pour sérialiser la RouterId
juste une chaîne de caractères comme "routerId": "aa:aa:aa:aa:aa:aa"
?
Edit: Je ajouté @Component
à mes SimpleModule
afin que les charges de démarrage Spring par défaut et il a écrit un test litte pour voir si les ObjectMapper
œuvres.
@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)))
}
}
fonctionne assez bien. Cela peut être un indicateur que mon code fonctionne tout le temps, mais Spring Data REST ne parvient pas à sérialiser mon modèle à un moment donné.
Oui, j'ai déjà réfléchi à ce sujet. Bien que cela puisse résoudre le problème dans ce cas simple, il serait bon de savoir comment je résoudrais cela avec des objets complexes. – kschlesselmann
Le prochain problème serait que 'String' n'est pas' open' ;-) – kschlesselmann