J'essaye de conditionner @JsonIgnore
certains champs d'une entité s'ils sont sérialisés à partir de la collection d'une autre entité (plusieurs à un).
J'ai essayé d'ajouter @JsonIgnoreProperties
à la collection mais si j'ai bien compris que l'annotation n'est pas à cette fin.
class A { //some fields @ManyToOne private B b; //if only A is requested, this should NOT be ignored } class B { //some fields @OneToMany @IgnorePrivateBInAToAvoidStackOverflow private Set<A> collectionOfAs; }
Y a-t-il un moyen d'obtenir ce comportement?
3 Réponses :
Si la classe B a une collection de classe A, alors l'ensemble de A de la classe B doit être annoté Je suppose que vous receviez une erreur StackOverflow parce que lorsque vous récupériez un objet de la classe B, il a apporté l'ensemble d'objets de la classe As avec lui, qui ont eux-mêmes apporté le même objet de la classe B qui a été extrait à l'origine, et cela irait indéfiniment, à moins que vous ne fournissiez @JsonIgnore sur le champ Set. De cette façon, lorsque vous appelez un objet de classe A, leur objet champ de classe B sera également récupéré, mais lorsque vous appelez un objet de classe B, leur collection de classe As sera ignorée. @OneToMany
, et le champ de la classe A doit être annoté @ManyToOne code>, alors vous pouvez mettre votre
@JsonIgnore
sur le plateau comme ceci: class A {
//some fields
@ManyToOne private B b; //if only A is requested, this should NOT be ignored
}
class B {
//some fields
@OneToMany
@JsonIgnore
private Set<A> collectionOfAs;
}
Je recherche une solution qui ignore uniquement le champ B de A s'il est accédé via la collection, sans omettre toute la collection.
Votre utilisation de @ManyToOne
& @OneToMany
est incorrecte, vous devez utiliser @OneToMany
dans le One
entité sur la propriété de collection d'entités Many
, et vice-versa pour @ManyToOne
class A { @ManyToOne @JsonBackReference private B b; } class B { @OneToMany @JsonManagedReference private Set<A> collectionOfAs; }
et pour autant que je sache, vous ' Je voudrais ignorer le propriétaire B
pour avoir fait une référence arrière de la classe A
, et créer une exception stackoverflow, pour y parvenir, utilisez l'annotation que j'ai ajoutée dans mon exemple ci-dessus @JsonBackReference
& @JsonManagedReference
qui arrêtera la boucle infinie sur ses traces.
Pour éviter la récursion infinie de référence circulaire (erreur de stackoverflow), vous devez annoter les cals avec @ JsonIdentityInfo
Donc, votre classe ressemble à:
@JsonIdentityInfo( generator = ObjectIdGenerators.PropertyGenerator.class, property = "id") class B { //some fields @ManyToOne @IgnorePrivateBInAToAvoidStackOverflow private Set<A> collectionOfAs; }
Même chose pour la classe B à bidirectionnelle utilisez:
@JsonIdentityInfo( generator = ObjectIdGenerators.PropertyGenerator.class, property = "id") class A { //some fields //Integer id; @OneToMany private B b; //if only A is requested, this should NOT be ignored }
sachez que la propriété
fait référence à votre nom de champ unique (défini sur id
dans cet exemple)
pour en savoir plus, consultez cet article
est-il possible de modifier la configuration de jackson mapper pour chaque cas?
@SharonBenAsher J'ai peur qu'il n'y ait pas d'annotation soutenant mon cas, donc oui, cela peut être modifiable.
voir si cela aide springquay.blogspot.com/ 2016/01 /…
@ buræquete oui je l'ai fait mais il a omis un côté ou l'autre, selon ce qui a été choisi comme arrière et géré (la classe A est également accessible individuellement).
Cela est dû à ceci Je suppose que cela fonctionnait comme prévu quand j'étais En l'utilisant... :(