2017-04-25 4 views
2

Je reçois en dessous de l'exception lors de la désérialisation, le profil invité est un objet imbriqué dans l'objet racine (quelques niveaux à l'intérieur). Je n'ai pas le contrôle sur la façon dont il est sérialisé puisque je suis seulement le consommateur de ce message d'un sujet de kafka. Y at-il un moyen de faire ce travail, autres que l'Jeton inattendu (END_OBJECT), attendu FIELD_NAME: propriété manquante '@type'

mapper.configure(DeserializationFeature.FAIL_ON_INVALID_SUBTYPE,false); 

qui fonctionne pour moi et retourne null pour GuestProfile avec d'autres attributs sont renseignés. Mais, j'ai besoin d'un moyen de personnaliser la désérialisation pour cet objet imbriqué particulier dans le JSON et le faire peupler.

com.fasterxml.jackson.databind.JsonMappingException: jeton inattendu (END_OBJECT), prévu FIELD_NAME: propriété manquante '@type' qui est à contient id de type (pour la classe com.test.GuestProfile)

Répondre

1

La bibliothèque Jackson JSON lève cette exception lorsque des interfaces ou des types polymorphes sont utilisés. GuestProfile doit être de type polymorphe, soit une interface, soit une classe abstraite, soit l'implémentation réelle et un parent.

Ce type polymorphe peut être configuré pour utiliser l'indicateur de type dans JSON. Cherchez quelque chose comme

@JsonTypeInfo (utilisation = JsonTypeInfo.Id.NAME, include = JsonTypeInfo.As.PROPERTY)

du type Java.

Vous pouvez modifier le nom par défaut @type, par exemple juste "type":

@JsonTypeInfo (utilisation = JsonTypeInfo.Id.NAME, include = JsonTypeInfo.As.PROPERTY, property = "type"

La valeur JSON sérialisée de votre objet nécessite actuellement cet attribut supplémentaire '@type'. Puisque vous ne pouvez pas changer la génération du JSON, ce n'est pas une solution pour vous.

S'il n'y a qu'une seule mise en œuvre, vous pouvez utiliser:

@JsonDeserialize (comme = GuestProfile.class)

Il est une fonctionnalité plutôt nouvelle de Jackson, il n'a pas toujours été là.

Sinon, vous pouvez personnaliser le processus de désérialisation. Vous pouvez configurer votre propre désérialiseur, puis examiner la valeur entrante et décider en fonction du contenu du type d'objet cible que vous désérialisez.

Voir https://github.com/FasterXML/jackson-docs/wiki/JacksonPolymorphicDeserialization