Я столкнулся с проблемой с аннотациями Джексона в моем классе 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
Аннотации Джексона не работают в Spring Boot ⇐ JAVA
Программисты JAVA общаются здесь
-
Anonymous
1735339943
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" }
]
}
Подробнее здесь: [url]https://stackoverflow.com/questions/79312933/jackson-annotations-not-working-in-spring-boot[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия