#java #spring #spring-boot #spring-hateoas
#java #весна #весенняя загрузка #spring-hateoas
Вопрос:
На основе этого руководства я пытаюсь добавить дополнительный сервис.
У него есть этот метод:
@GetMapping(path = "/albums")
public PagedModel<Album> getAlbums(Pageable pageable) {
final var albums = albumRepository.findAll(pageable);
return PagedModel.of(albums.getContent(), new PagedModel.PageMetadata(albums.getSize(), pageable.getPageNumber(),
albums.getTotalElements(), albums.getTotalPages()));
}
Актер:
package example;
import java.io.Serializable;
import java.util.List;
import javax.persistence.CascadeType;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.JoinTable;
import javax.persistence.ManyToMany;
import javax.persistence.Table;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.ToString;
@Data
@Builder
@AllArgsConstructor
@NoArgsConstructor
@ToString(exclude = "albums")
@Entity
@Table(name="actor")
public class Actor implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String firstName;
private String lastName;
private String birthDate;
@ManyToMany(cascade= CascadeType.ALL)
@JoinTable(
name = "actor_album",
joinColumns = @JoinColumn(name = "actor_id"),
inverseJoinColumns = @JoinColumn(name = "album_id"))
private List<Album> albums;
}
Альбом:
package example;
import java.io.Serializable;
import java.util.List;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.ManyToMany;
import javax.persistence.Table;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.ToString;
@Data
@Builder
@AllArgsConstructor
@NoArgsConstructor
@Entity
@ToString(exclude = "actors")
@Table(name="album")
public class Album implements Serializable
{
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String title;
private String description;
private String releaseDate;
@ManyToMany(mappedBy = "albums",fetch = FetchType.EAGER)
private List<Actor> actors;
}
Если я вызываю свой метод, возникает ошибка StackOverflowError:
java.lang.StackOverflowError: null
at java.base/java.lang.ClassLoader.defineClass1(Native Method) ~[na:na]
at java.base/java.lang.ClassLoader.defineClass(ClassLoader.java:1016) ~[na:na]
at java.base/java.security.SecureClassLoader.defineClass(SecureClassLoader.java:174) ~[na:na]
at java.base/jdk.internal.loader.BuiltinClassLoader.defineClass(BuiltinClassLoader.java:800) ~[na:na]
at java.base/jdk.internal.loader.BuiltinClassLoader.findClassOnClassPathOrNull(BuiltinClassLoader.java:698) ~[na:na]
at java.base/jdk.internal.loader.BuiltinClassLoader.loadClassOrNull(BuiltinClassLoader.java:621) ~[na:na]
at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:579) ~[na:na]
at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:178) ~[na:na]
at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:521) ~[na:na]
at com.fasterxml.jackson.databind.ser.std.BeanSerializerBase.serializeFields(BeanSerializerBase.java:773) ~[jackson-databind-2.11.2.jar:2.11.2]
at com.fasterxml.jackson.databind.ser.BeanSerializer.serialize(BeanSerializer.java:178) ~[jackson-databind-2.11.2.jar:2.11.2]
at com.fasterxml.jackson.databind.ser.std.CollectionSerializer.serializeContents(CollectionSerializer.java:145) ~[jackson-databind-2.11.2.jar:2.11.2]
at com.fasterxml.jackson.databind.ser.std.CollectionSerializer.serialize(CollectionSerializer.java:107) ~[jackson-databind-2.11.2.jar:2.11.2]
at com.fasterxml.jackson.databind.ser.std.CollectionSerializer.serialize(CollectionSerializer.java:25) ~[jackson-databind-2.11.2.jar:2.11.2]
Проблема, по-видимому, заключается в том, что только корневой альбом отображается правильно, а для связанных участников вместо выдержки отображается полная сущность, включая ссылку на альбом.
Если я использую пользовательский ассемблер и генерирую явные DTO в качестве возвращаемого объекта, я теряю различные ссылки generate по умолчанию.
Есть идеи, как я могу получить автоматическую сериализацию, которая запускается, когда у меня нет пользовательских RestController
настроек?
Комментарии:
1. Двунаправленная связь является корнем проблемы здесь. Необходимо ли его использовать?
2. К счастью, это не так, и я мог бы его удалить. (Понял это вчера на себе :). Но почему выдержка не используется? Когда я вызываю опубликованный репозиторий напрямую, он используется.