Jackson désérialisation sur plusieurs types
J'ai une classe abstraite appelée Instance
puis deux implémentations de cette, UserInstance
et HardwareInstance
. La question que je vais avoir, c'est que lorsque j'appelle le point de terminaison rest pour un @POST
dans la base de données, idéalement je voulais que ça ressemble à .../rest/soexample/instance/create
où l'instance est passé pour le RESTE de point de terminaison. Si Instance
n'était pas abstraite avec plus d'une mise en œuvre, il serait très bien, mais depuis que j'ai 2, j'obtiens un Jackson.databind
erreur.
" problème: résumé des types doivent être mappés aux types de béton, ont coutume deserializer, ou être instancié avec d'autres informations de type"
Après avoir cherché une solution à ce que j'ai trouvé une réponse qui dit que je pouvais utiliser quelque chose comme:
@JsonDeserialize(as=UserInstance.class)
Mais il semble comme une cette isonly utile si l'on est une implémentation de la classe abstraite. En supposant que je ne peux pas appeler deux fois puisqu'il n'y aurait aucun moyen pour elle de décider quel type d'instance, il serait.
Donc, je me demande quelle est la meilleure façon de gérer cette situation? Dois-je créer différents points de terminaison? Comme:
.../rest/soexample/userinstance/create
& .../rest/soexample/hardwareinstance/create
Je ne suis pas trop sûr que je suis un noobie @ RESTE, si activement en train d'apprendre. Merci!
source d'informationauteur erp | 2015-09-24
Vous devez vous connecter pour publier un commentaire.
Voici ce que j'ai fait dans le même cas:
Vous annoter
Instance
avec@JsonDeserialize(using = InstanceDeserializer.class)
pour indiquer la classe à être utilisé pour désérialiser la classe abstraite. Vous devez alors indiquer que chaque enfant de la classe sera désérialiséas
eux-mêmes, sinon ils vont utiliser la classe parent deserializer et vous obtiendrez unStackOverflowError
.Enfin, à l'intérieur de la
InstanceDeserializer
vous mettez la logique de désérialiser une ou de l'autre de la classe enfant (checkConditionsForUserInstance()
par exemple).