Sérialiser les entités JPA bidirectionnelles à JSON avec jackson
Je suis l'aide de Jackson pour sérialiser mon JPA modèle en JSON.
J'ai les classes suivantes:
import com.fasterxml.jackson.annotation.*;
import javax.persistence.*;
import java.util.Set;
@JsonInclude(JsonInclude.Include.NON_NULL)
@JsonIgnoreProperties(ignoreUnknown = true)
@JsonIdentityInfo(generator = ObjectIdGenerators.PropertyGenerator.class)
@Entity
public class Parent {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String name;
@JsonManagedReference
@OneToMany(mappedBy = "parent", cascade = CascadeType.ALL, fetch = FetchType.EAGER)
private Set<Child> children;
//Getters and setters
}
et
import com.fasterxml.jackson.annotation.*;
import javax.persistence.*;
import java.util.HashSet;
import java.util.Set;
@JsonInclude(JsonInclude.Include.NON_NULL)
@JsonIgnoreProperties(ignoreUnknown = true)
@JsonIdentityInfo(generator = ObjectIdGenerators.IntSequenceGenerator.class)
@Entity
public class Child {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String name;
@JsonBackReference
@ManyToOne
@JoinColumn(name = "parentId")
private Parent parent;
//Getters and setters
}
Je suis en utilisant le POJO cartographie de sérialiser d'un modèle à l'JSON. Quand je sérialiser un objet Parent, j'ai le JSON:
{
"id": 1,
"name": "John Doe",
"children": [
{
"id": 1,
"name": "child1"
},{
"id": 2,
"name": "child2"
}
]
}
Mais quand je sérialiser un Enfant j'ai le JSON:
{
"id": 1,
"name": "child1"
}
La référence à la mère est manquant.
Est-il un moyen de résoudre ce problème?
source d'informationauteur mmjmanders
Vous devez vous connecter pour publier un commentaire.
Je pense que vous avez à choisir entre le @JsonIdentityInfo et l' @JsonBackReference/@JsonManagedReference.
Je voudrais aller avec : @JsonIdentityInfo(générateur = ObjectIdGenerators.PropertyGenerator.class, propriété="id") sur votre entités, supprime @JsonBackReference/@JsonManagedReference paires.
Et ajoutez @JsonIgnore sur les champs que vous souhaitez exclure.
Vous pouvez utiliser JsonManagedReference /JsonBackReference et à utiliser en même temps JsonIdentityInfo pour compléter les relations bidirectionnelles.
En question de la Classe:
Dans la réponse de la Classe:
//bi-directionnelle de type plusieurs-à-une association à la Question
Si vous avez besoin d'référence du parent de l'enfant objet, supprimer Géré /Référence Arrière, cela fonctionne très bien pour moi.
Le problème est que l'utilisation de la gestion de la/les références arrières exige que la direction de la traversée est toujours à partir d'un parent à un enfant (qui est, à l'aide de références gérées en premier). C'est une limitation de ces annotations.
Que l'autre réponse suggère, l'utilisation de l'Id d'Objet est le plus flexible alternative qui pourrait peut-être travailler.
Une autre option qui pourrait peut-être le travail serait d'utiliser JSON Vues ou JSON Filtre à conditionnellement inclure/exclure parent de référence, si vous pouvez séparer les cas. Cela pourrait être gênant.
Vous pouvez utiliser @JsonBackReference/@JsonManagedReference et ajouter cette méthode pour enfant
Le résultat sera:
J'espère que cela aide quelqu'un.