我有两个 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 中的输出:
- 您可以在具有关系的字段(
activities
或users
)上使用@JsonIgnore
。 - 如果您想使用父级而不是子级生成 json,可以使用
@JsonBackReference
注释users
,使用activities
注释@JsonManagedReference
关于java - Spring Boot Hibernate 一对多无限递归,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59912934/