Вот мои модели :
Competence.java
@Data @AllArgsConstructor @NoArgsConstructor @Entity
public class Competence {
@Id @GeneratedValue(strategy = GenerationType.IDENTITY)
private Integer id;
@Column(unique=true)
private String nom;
}
CompetenceUtilisateur**.java**
//@JsonIdentityInfo(
// generator = ObjectIdGenerators.PropertyGenerator.class,
// property = "id")
@Data @AllArgsConstructor @NoArgsConstructor @Entity
public class CompetenceUtilisateur {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Integer id;
private String nom;
@Enumerated(EnumType.STRING)
private Niveau niveau;
private Integer idListDesCompetences;
//============ Relation =============//
@ManyToOne
@JoinColumn(name = "Competence_Id", nullable = false)
private Competence competence;
@ManyToOne
// @JsonBackReference
// @JsonIgnore
private ListCompetencesUtilisateur ListDesCompetences;
//============ Les Methodes =============//
public void setCompetenceDeProjet(ListCompetencesRequise listcompetenceDeProjet) {
this.ListDesCompetencesRequise = listcompetenceDeProjet;
this.idListCompetencesRequise = listcompetenceDeProjet.getId();
}
public void setCompetences(Competence competences) {
this.competences = competences;
this.nom = competences.getNom();
}
}
ListCompetencesUtilisateur .java
@Data @AllArgsConstructor @NoArgsConstructor @Entity
public class ListCompetencesUtilisateur {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Integer id;
private Integer idUtilisateur;
//============ Relation =============//
@OneToOne @JsonIgnore
private Utilisateur utilisateur;
@OneToMany( mappedBy = "ListDesCompetences")
// @JsonManagedReference
private List CompetenceUtilisateur;
//============ Les Methodes =============//
public void setcompetenceDeUtilisateur(Utilisateur utilisateur) {
this.utilisateur = utilisateur;
this.idUtilisateur = utilisateur.getId();
}
}
Проблема
Когда я вызываю REST API для получения объекта типа ListCompetencesUtilisateur, ответ JSON приводит к бесконечной рекурсии, потому что двунаправленных отношений.
Вот пример:
{
"id": 1,
"idUtilisateur": 3,
"competenceUtilisateur": [
{
"id": 1,
"nom": "Java",
"listDesCompetences": {
"id": 1,
"idUtilisateur": 3,
"competenceUtilisateur": [
{
"id": 1,
"nom": "Java",
"listDesCompetences": {
...
}
}
]
}
}
]
}
Шаги, которые я пробовал
- Добавлен @JsonIgnore на одной стороне связи .
- Используются аннотации @JsonManagedReference и @JsonBackReference.
Пробовал @JsonIdentityInfo с ObjectIdGenerators.PropertyGenerator.class Это работает, если я использую RestController, но проблема в том, что я использую @RepositoryRestResource и получаю эту ошибку: com.fasterxml.jackson.databind.exc.InvalidDefinitionException: Invalid Определение идентификатора объекта для `xxx.xxxxx.appservice.Entity.ListCompetencesUtilisateur`: невозможно найти свойство с именем 'id' (через цепочку ссылок: org.springframework.hateoas.PagedModel["_embedded"]->java.util.LinkedHashMap["listCompetencesUtilisateurs"]- >java.util.ArrayList[0])
Является ли GraphQL идеальным решением этой проблемы?
При получении объект типа ListCompetencesUtilisateur, я хочу включить список CompetenceUtilisateur, но без вложенных ссылок, вызывающих бесконечный цикл.
Для пример:
{
"id": 1,
"idUtilisateur": 3,
"competenceUtilisateur": [
{
"id": 1,
"nom": "Java",
"competences": {
"id": 1,
"nom": "Java"
}
}
]
}
Подробнее здесь: https://stackoverflow.com/questions/793 ... gnore-dont
Мобильная версия