Аннотации Джексона не работают в Spring BootJAVA

Программисты JAVA общаются здесь
Ответить
Anonymous
 Аннотации Джексона не работают в Spring Boot

Сообщение Anonymous »

Я столкнулся с проблемой с аннотациями Джексона в моем классе User при управлении самоссылающейся связью @ManyToMany. Несмотря на применение соответствующих аннотаций, Джексону не удается правильно обработать отношения. Когда я извлекаю сущность «Пользователь», последователи и последующие поля входят в рекурсивный цикл, что приводит к бесконечному циклу ссылок.
Вот сущность «Пользователь»:
import com.fasterxml.jackson.annotation.*;
import com.pubfinder.pubfinder.models.enums.Role;
import jakarta.persistence.*;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;

import java.io.Serializable;
import java.util.HashSet;
import java.util.Set;
import java.util.UUID;

/**
* The type User.
*/
@Entity
@Table(name = "users")
@AllArgsConstructor
@NoArgsConstructor
@Builder
@JsonIdentityInfo(generator = ObjectIdGenerators.UUIDGenerator.class, property = "id")
public class User {
@Id
@GeneratedValue
@Column(unique = true, nullable = false)
private UUID id;
@Column(unique = true, nullable = false)
private String username;
private String firstname;
private String lastname;
@Column(unique = true, nullable = false)
private String email;
@Column(nullable = false)
private String password;
@Column(nullable = false)
@Enumerated(EnumType.ORDINAL)
private Role role;

@ManyToMany(
fetch = FetchType.LAZY,
cascade = {CascadeType.PERSIST, CascadeType.MERGE, CascadeType.REFRESH}
)
@JoinTable(
name = "user_following",
joinColumns = @JoinColumn(name = "user_id"),
inverseJoinColumns = @JoinColumn(name = "following_id")
)
@Builder.Default
@JsonManagedReference
Set following = new HashSet();

@ManyToMany(
mappedBy = "following",
fetch = FetchType.LAZY,
cascade = {CascadeType.PERSIST, CascadeType.MERGE, CascadeType.REFRESH}
)
@Builder.Default
@JsonBackReference
Set followers = new HashSet();

@PreRemove
private void cleanupFollowerRelationshipsBeforeDeletion() {
for (User user : this.following) {
user.getFollowers().remove(this);
}
}

public void addFollowing(User user) {
if (!this.following.contains(user)) {
this.following.add(user);
user.getFollowers().add(this);
}
}

public void removeFollowing(User user) {
if (this.following.contains(user)) {
this.following.remove(user);
user.getFollowers().remove(this);
}
}

// Getters and Setters......
}

Зависимости:
Вот основные зависимости в моем файле build.gradle:
implementation("org.springframework.boot:spring-boot-starter-web")
implementation("org.springframework.boot:spring-boot-starter-data-jpa")
implementation("com.fasterxml.jackson.core:jackson-annotations:2.15.4")
implementation("org.projectlombok:lombok")
annotationProcessor("org.projectlombok:lombok")
testImplementation("com.h2database:h2")

Джексону следует правильно обрабатывать двунаправленные связи с использованием @JsonManagedReference и @JsonBackReference, а процесс сериализации/десериализации должен избегать бесконечной рекурсии.
Я также сделал это пробовал @JsonIdentityInfo и @JsonIgnore, но ничего не помогает.
Вот как я хочу, чтобы результат выглядел:
{
"id": "1",
"username": "user1",
"following": [
{
"id": "2",
"username": "user2",
"following": [
{
"id": "1",
"username": "user1",
"following": [ /* infinite nesting */ ]
}
]
}
]
}

Вот как я хочу, чтобы это выглядело:
{
"id": "1",
"username": "user1",
"following": [
{ "id": "2", "username": "user2" }
],
"followers": [
{ "id": "3", "username": "user3" }
]
}


Подробнее здесь: https://stackoverflow.com/questions/793 ... pring-boot
Ответить

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

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

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

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

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