【问题标题】:Springboot Hibernate One to Many infinty recursionSpring Boot Hibernate 一对多无限递归
【发布时间】:2020-01-25 20:00:59
【问题描述】:

我有两个 SQL 表如下:

用户
身份证
用户名
密码
...以及更多无关紧要的东西

活动
身份证
名称
说明
用户

我使用它们的存储库创建了两个实体类(使用注释 @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

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

 @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();
    }

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

[{"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....

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

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

【问题讨论】:

  • 顺便说一句,来自 getActivities() 的 getter 如下: public Set getActivities() { return activities; }

标签: java spring spring-boot set spring-data


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-25
    • 1970-01-01
    • 2018-10-02
    相关资源
    最近更新 更多