Я не знаю, почему @JsonManagedReference, @JsonBackReference и @JsonIgnore не работают с конкретным объектом, есть ли друJAVA

Программисты JAVA общаются здесь
Ответить
Anonymous
 Я не знаю, почему @JsonManagedReference, @JsonBackReference и @JsonIgnore не работают с конкретным объектом, есть ли дру

Сообщение Anonymous »

Я работаю над приложением Spring Boot, используя JPA и Jackson для сериализации объектов в JSON. У меня есть три модели, две с двунаправленными связями, и я столкнулся с проблемой бесконечной рекурсии при попытке сериализации одного из объектов.
Вот мои модели :
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
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «JAVA»