Json et Java - Référence circulaire
Je vais avoir et problème avec la référence Circulaire.
Je Reste Webservices qui retourne des objets à l'avant, le problème c'est quand j'essaie de renvoyer les objets qui ont plusieurs références, afin que le résultat que j'obtiens une infinie réponse, qui génèrent
java.lang.IllegalStateException:
Cannot call sendError() after the response has been committed
Les objets sont automatiquement générées par Hibernate Génération de Code et j'ai besoin d'avoir la référence circulaire dans le backend, j'ai juste besoin de l'enlever avant d'envoyer les informations à l'interface à l'aide de Jackson.
La méthode de contrôleur d'en-tête est:
@RequestMapping(value="/list", method=RequestMethod.POST)
public @ResponseBody eventResponse list(@RequestBody String sessionID) {
Je ne fais rien explicite pour convertir en Json, je suis un newby avec cela et je pense que jackson réglé automatiquement.
source d'informationauteur Faabass
Vous devez vous connecter pour publier un commentaire.
Il y a deux façons vous pouvez aller à ce sujet. Si vous devez exposer votre entité pour le monde extérieur, je recommande d'ajouter
@JsonIgnore
sur la propriété qui est à l'origine de la référence circulaire. Cela indiquera à Jackson de ne pas sérialiser cette propriété.Un autre moyen est d'utiliser la bidirectionnel fonctionnalités fournies par Jackson. Vous pouvez soit utiliser
@JsonManagedReference
ou@JsonBackReference
.@JsonManagedReference
est le "transférer" une partie de la propriété et elle sera sérialisé normalement.@JsonBackReference
est le "retour" de la référence; il ne doit pas être sérialisé, mais sera reconstruit à quand le type est désérialisé.Vous pouvez consulter les exemples ici.
Cela répond à votre commentaire: je pense que ce que vous voulez faire dans ce cas est d'utiliser un DTO qui est visible de l'extérieur. J'aime cette approche parce que je ne veux pas exposer mes entités à l'extérieur. Cela signifie que la Jackson les annotations devraient être sur la DTO et pas sur le enity. Vous auriez besoin d'une sorte de mapper ou convertisseur qui convertit l'entité à la DTO. Maintenant, lorsque vous apportez des modifications à votre entité, ils ne seront pas propagées à la DTO, sauf si vous modifiez votre mapper/convertisseur. Je pense que c'est ok, parce que lorsque vous apportez une modification à votre entité, vous pouvez décider si vous voulez que le changement exposé ou non.
Mise à JOUR
Il y a un bon post de blog ici qui va dans le détail sur les différentes manières de gérer les relations bidirectionnelles à Jackson. Il décrit les solutions qui utilisent
@JsonIgnore
@JsonManagedReference
et@JsonBackReference
@JsonIdentityInfo
@JsonView
et personnalisé sérialiseur. C'est un très complet, description des différentes techniques que vous pouvez utiliser.Une seule annotation
@JsonIdentityInfo
résout le problème. Il gère les références circulaires.Référence