java - Spring Boot Hibernate 一对多无限递归

标签 java spring spring-boot set spring-data

我有两个 SQL 表如下:

用户
id
用户名
密码
...以及更多不相关的东西

Activity
id
姓名
描述
用户

我用它们的存储库创建了两个实体类(带有注释@RepositoryRestResource)

@Entity
public class Users {
    @Id
    private int id;
    private String username;
    private String password;

    @OneToMany(mappedBy = "users")
    private Set<Activities> activities;

    public Set<Activities> getActivities() {
        return activities;
    }

//constructors && getters setters


@Entity
public class Activities {

    @Id
    private int id;

    @ManyToOne
    @JoinColumn(name = "users")
    private Users users;

    private String name;

    private String description;

//constructors && get

我通过创建 Activity 创建了一个端点来测试工作流程。全部硬编码如下

 @RequestMapping("/calendar")
    public Set<Activities> goToCalendar(Authentication authentication){
        Users user = unbreakableService.isAuth(authentication);
        Activities activities = new Activities(user,"karate", "entrenobueno");
        activitiesRespository.save(activities);
        return usersRepository.findByUsername(user.getUsername()).getActivities();
    }

代码正确保存了 Activity ,但是,当它应该返回 Activity 列表时,它返回无限递归信息,例如:

[{"id":161,"users":{"id":121,"username":"Ojka","password":"$2a$10$Z/bj.5JvQmPquJ67fqF.leUyBkkXJ/2x3z/.bUon8YsIAdV8HMnoG","email":"ojka","pushup":99999,"pullup":null,"handstandhold":9999,"handstandpushup":null,"frontlever":null,"backlever":null,"activities":[{"id":161,"users":{"id":121,"username":"Ojka","password":"$2a$10$Z/bj.5JvQmPquJ67fqF.leUyBkkXJ/2x3z/.bUon8YsIAdV8HMnoG","email":"ojka","pushup":99999,"pullup":null,"handstandhold":9999,"handstandpushup":null,"frontlever":null,"backlever":null,"activities":[{"id":161,"users":{"id":121,"username":"Ojka","password":"$2a$10$Z/bj.5JvQmPquJ67fqF.leUyBkkXJ/2x3z/.bUon8YsIAdV8HMnoG","email":"ojka","pushup":99999,"pullup":null,"handstandhold":9999,"handstandpushup":null,"frontlever":null,"backlever":null,"activities":[{"id":161,"users":{"id":121,"username":"Ojka","password":"$2a$10$Z/bj.5JvQmPquJ67fqF.leUyBkkXJ/2x3z/.bUon8YsIAdV8HMnoG","email":"ojka","pushup":99999,"pullup":null,"handstandhold":9999,"handstandpushup":null,"frontl

我无法读取整个日志,因为控制台没有显示那么多信息。 这是我看到的第一个错误

 Failure while trying to resolve exception [org.springframework.http.converter.HttpMessageNotWritableException]

java.lang.IllegalStateException: Cannot call sendError() after the response has been committed.

这是日志的最后一行

2020-01-25 20:48:54.795 ERROR 19924 --- [nio-8080-exec-2] s.e.ErrorMvcAutoConfiguration$StaticView : Cannot render error page for request [/api/calendar] and exception [Could not write JSON: Infinite recursion (StackOverflowError); nested exception is com.fasterxml.jackson.databind.JsonMappingException: Infinite recursion (StackOverflowError) (through reference chain: com.unbreakable.unbreakable.persistance.Users["activities"]->org.hibernate.collection.internal.PersistentSet[0]->com.unbreakable.unbreakable.persistance.Activities["users"]->com.unbreakable.unbreakable.persistance.Users["activities"]->org.hibernate.collection.internal.Persi....

如果我检查表 Activity (SELECT * FROM ACTIVITIES),则不会有无限信息。只是一些 Activity (我创建的测试它的 Activity )。

我相信,它应该返回用户拥有的一组 Activity 。

最佳答案

您可以通过多种方式抑制 json 中的输出:

  1. 您可以在具有关系的字段(activitiesusers)上使用 @JsonIgnore
  2. 如果您想使用父级而不是子级生成 json,可以使用 @JsonBackReference 注释 users,使用 activities 注释@JsonManagedReference

关于java - Spring Boot Hibernate 一对多无限递归,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59912934/

相关文章:

java - 从 InputStream 读取数据包 - 正确的设计

java - 告诉 Datastax Java Cassandra 驱动程序超时集群连接

spring-boot - 如何实现自定义 CompositeHealthContributor

java - 在初始化 SpringBootApplication 的 ApplicationContextInitializer bean 之前启动一个 @WebServlet

java - 重新扫描仪的.next()方法: What happens after last valid token read?

java - Android 使用位置管理器获取纬度和经度

java - Spring Batch - 在处理器和写入器之间传递数据

java - 在以编程方式配置 Jetty 嵌入式服务器中使用 HttpRequestHandler Servlet

java - 单元测试用例中的空 @Autowired beans

java - 无法从容器外部运行的 Spring Boot 应用程序连接到容器中运行的 Kafka