2017-05-29 1 views
1

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é.

Répondre

0

Que diriez-vous laisser class RouterId hériter de String?

+0

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

+0

Le prochain problème serait que 'String' n'est pas' open' ;-) – kschlesselmann