0

J'ai deux classes, comme indiqué ci-dessous dans un bi-directionnel plusieurs à plusieurs:Perdre les données de l'enfant dans une relation bidirectionnelle lors de l'utilisation jacksonMapper

Parent implements Serializable{ 

     @ManytoMany(//declaration for join table) 
     @JsonBackReference 
     @com.fasterxml.jackson.annotation.JsonIgnore 
     Set <Child> childSet; 

    } 
    Child implements Serializable{ 
    @ManytoMany(//declaration for join table) 
    @JsonManagedReference 
    @com.fasterxml.jackson.annotation.JsonIgnore 
    Set <Parent> parentSet; 
    // other getter and setters 
    } 

Je fais un appel dans mon DAO pour obtenir un parent particulier. Avec les détails parentaux, je veux aller chercher les enfants du parent. Quelque chose comme ceci:

Hibernate.initialize(parent.getChildSet()); //this works perfectly 
// and I get the details of parent along with the children in my DAO call. 

Mais quand je fais le bas dans mon service d'affaires en retournant les données au contrôleur les enfants sont omis de la chaîne JSON mère.

jacksonMapper.writeValueAsString(parent); 

donc je l'ai enlevé la @JsonIgnore sur l'attribut de l'enfant à l'intérieur de la pensée classe parent qui jackson peut comprendre que ces champs ne doivent pas être ignorés lors de l'écriture à une chaîne comme indiqué ci-dessous. Mais il les ignore encore! :(

Parent implements Serializable{ 

    @ManytoMany(//declaration for join table) 
    @JsonBackReference 
    //@com.fasterxml.jackson.annotation.JsonIgnore 
    Set <Child> childSet; 

} 

Toute idée où je pourrais aller mal

?
+0

Pourriez-vous également ajouter votre requête db? – k1133

+0

@ k1133 le côté db J'utilise hibernate et c'est une requête select all sur FoodItem. Je veux que les catégories viennent aussi avec foodItem. Mais en utilisant jacksonMapper les catégories sont omises dans la chaîne json retournée. – dirai

+0

J'ai supprimé l'attribut @JsonIgnore on Child dans la classe Parent en pensant que jackson pourrait comprendre que ces champs ne doivent pas être ignorés lors de l'écriture dans une chaîne. Mais il les ignore encore!:( – dirai

Répondre

0

Je n'ai pas été en mesure de savoir pourquoi ce qui se passe. En attendant, j'ai opté pour une solution de contournement. Je fais deux appels distincts à DB: Un pour récupérer le parent en premier, puis le second pour extraire l'enfant en fonction du parentId récupéré

Alternativement, je peux faire les appels DB au service en même temps et préparer le JSON comme une chaîne complexe avant de l'envoyer. à l'interface utilisateur:

complex:{ 
parent:parent, 
child:child 
} 

Dans les deux cas, il s'agit d'une solution de contournement. La solution idéale consiste simplement à supprimer @ JsonIgnore dans le mappage uniquement du côté parent pour la classe enfant. Mais d'une certaine manière cela ne semble pas fonctionner. Je posterai au cas où je trouverais pourquoi la solution "idéale" ne fonctionne pas!

solution idéale mise à jour comme réponse le 15 août 2016, le Jour de l'Indépendance de l'Inde:

Le problème est dans la mise en correspondance:

Parent implements Serializable{ 

     @ManytoMany(//declaration for join table) 
     @JsonBackReference 
     @com.fasterxml.jackson.annotation.JsonIgnore 
     Set <Child> childSet; 

    } 

Quand vous dites @JsonBackReference cela signifie réellement ignorer ce champ en écrivant JSON, c.-à-dire,

@JsonBackReference < -> @JsonIgnore

Par conséquent, l'enfant est omis lorsque le parent est sérialisé. Avec les mappages ORM, il est toujours préférable d'avoir les annotations unilatérales plutôt que recto-verso. De cette façon, vous pouvez éviter de nombreuses exceptions indésirables lors de l'extraction des données et, deuxièmement, garder votre code d'entreprise propre.

JsonManagedReference vs JsonBackReference