java - StackOverflowError:执行获取请求时为空
问题描述
当我尝试向我的 /users 端点发出 get 请求时遇到问题,而不是返回我想要的,而是返回以下错误:
2018-07-07 17:00:06.636 ERROR 294108 --- [nio-8080-exec-3] o.a.c.c.C.[.[.[/].[dispatcherServlet] : Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is org.springframework.http.converter.HttpMessageNotWritableException: Could not write JSON: Infinite recursion (StackOverflowError); nested exception is com.fasterxml.jackson.databind.JsonMappingException: Infinite recursion (StackOverflowError) (through reference chain: io.union.restapi.domain.Group["users"]->org.hibernate.collection.internal.PersistentSet[0]->io.union.restapi.domain.User["group"]->io.union.restapi.domain.Group["users"]->org.hibernate.collection.internal.PersistentSet[0]->io.union.restapi.domain.User["group"]->io.union.restapi.domain.Group["users"]->org.hibernate.collection.internal.PersistentSet[0]->io.union.restapi.domain.User["group"]->io.union.restapi.domain.Group["users"]->io.union.restapi.domain.User["group"]->io.union.restapi.domain.Group["users"]->org.hibernate.collection.internal.PersistentSet[0]->io.union.restapi.domain.User["group"]->io.union.restapi.domain.Group["users"]->org.hibernate.collection.internal.PersistentSet[0]->io.union.restapi.domain.User["group"]->io.union.restapi.domain.Group["users"]->org.hibernate.collection.internal.PersistentSet[0]->io.union.restapi.domain.User["group"]->io.union.restapi.domain.Group["users"]->org.hibernate.collection.internal.PersistentSet[0]->io.union.restapi.domain.User["group"]->io.union.restapi.domain.Group["users"]->org.hibernate.collection.internal.PersistentSet[0]->io.union.restapi.domain.User["group"]->io.union.restapi.domain.Group["users"]->org.hibernate.collection.internal.PersistentSet[0]->io.union.restapi.domain.User["group"]->io.union.restapi.domain.Group["users"]->org.hibernate.collection.internal.PersistentSet[0]->io.union.restapi.domain.User["group"]->io.union.restapi.domain.Group["users"]->org.hibernate.collection.internal.PersistentSet[0]->io.union.restapi.domain.User["group"]->io.union.restapi.domain.Group["users"]->org.hibernate.collection.internal.PersistentSet[0]->io.union.restapi.domain.User["group"]->io.union.restapi.domain.Group["users"]->org.hibernate.collection.internal.PersistentSet[0]->io.union.restapi.domain.User["group"]->io.union.restapi.domain.Group["users"]->org.hibernate.collection.internal.PersistentSet[0]->io.union.restapi.domain.User["group"]->io.union.restapi.domain.Group["users"])] with root cause
java.lang.StackOverflowError: null
at java.lang.ClassLoader.defineClass1(Native Method) ~[na:1.8.0_171]
at java.lang.ClassLoader.defineClass(ClassLoader.java:763) ~
我的端点方法:
@Override
public ResponseEntity<List<M>> findAll() {
List<M> models = repository.findAll();
if(models == null || models.isEmpty()){
return ResponseEntity.noContent().build();
}
return ResponseEntity.ok(models);
}
用户型号:
@Entity
@Table(name = "UN_USERS")
public class User extends AbstractModel {
@Column(name = "USERNAME", unique = true)
private String username;
@Column(name = "UUID")
private String uuid;
@Column(name = "COINS")
private long coins;
@Column(name = "TOKENS")
private long tokens;
@ManyToOne
@JoinColumn(name = "GROUP_ID", nullable = true)
private Group group;
//getters & setters...
}
团体型号:
@Entity
@Table(name="UN_GROUPS")
public class Group extends AbstractModel{
private String prefix;
@OneToMany(mappedBy = "group")
private Set<User> users;
@ManyToMany(mappedBy = "groups")
private Set<Permission> permissions;
}
什么可能会导致此错误,我该如何解决?
解决方案
通过分析报错信息,这部分具体:
through reference chain: io.union.restapi.domain.Group["users"]->org.hibernate.collection.internal.PersistentSet[0]->io.union.restapi.domain.User["group"]->io.union.restapi.domain.Group["users"]
我们得到参考链形成一个循环。您遇到了杰克逊无限递归问题,有几种方法可以解决它。您可以在此处找到涵盖处理方法的好文章
推荐阅读
- arrays - Delphi 10.2.3 中的 Setlength 用于类似数组的类型
- java - Android中的h264原始数据流和渲染
- reverse-proxy - 通过 ARR 反向代理进行 NTLM 身份验证 - 502.3 错误
- python - 保存 FogBugz 附件时,服务器总是返回空响应(带有一些标头)
- android - Android - 在一个应用程序中设置多个具有不同服务的 Firebase 项目
- android - android微调器对话框弹出背景
- node.js - 服务器端文件系统浏览器
- angular - 如何在 Angular 4 应用程序中使用 Mat-Tree 模块
- r - 延迟计算闪亮与handsontable
- sql - 在 CASE 语句中选择 2 个不同的值