3
votes

Propriété JsonIgnore si elle est appelée à partir d'une relation d'entité

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?


5 commentaires

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... :(


3 Réponses :


0
votes

Si la classe B a une collection de classe A, alors l'ensemble de A de la classe B doit être annoté @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 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.


1 commentaires

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.



2
votes

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.


0 commentaires

2
votes

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


0 commentaires