- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个非常烦人的无限递归问题。我的应用程序正在构建为 Spring Rest API,我使用 Lombok 生成构造函数以及 getter 和 setter。我的模型很少。
AppUser - 可能是最大的一个。
@NoArgsConstructor
@AllArgsConstructor
@Data
@Entity
public class AppUser {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String login;
private String name;
private String surname;
@JsonProperty(access = JsonProperty.Access.WRITE_ONLY)
private String password;
public AppUser(String login, String password, UserRole userRole) {
this.login = login;
this.password = password;
this.userRoleSet = new HashSet<>();
this.userRoleSet.add(userRole);
}
public AppUser(String login, String name, String surname, String password) {
this.login = login;
this.name = name;
this.surname = surname;
this.password = password;
}
@OneToMany(mappedBy = "appUser",fetch = FetchType.EAGER)
private Set<UserRole> userRoleSet;
@OneToMany(mappedBy = "createdBy")
private List<Incident> createdIncidentsList;
@OneToMany(mappedBy = "assignedTo")
private List<Incident> assignedToIncidentsList;
@OneToMany(mappedBy = "postedBy")
private List<Comment> commentList;
@OneToMany(mappedBy = "appUser")
private List<IncidentChange> incidentChangeList;
}
事件
@Data
@Entity
public class Incident {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String title;
private String description;
private LocalDateTime creationDate;
private IncidentStatus status;
@OneToMany(mappedBy = "incident", cascade = CascadeType.ALL)
private List<Comment> commentList;
@ManyToOne
private AppUser createdBy;
@ManyToOne
private AppUser assignedTo;
@OneToOne(cascade = CascadeType.ALL)
private ChangeLog changeLog;
public Incident(String title, String description) {
this.title = title;
this.description = description;
this.creationDate = LocalDateTime.now();
this.status = IncidentStatus.NEW;
this.commentList = new ArrayList<>();
this.changeLog = new ChangeLog();
}
public Incident(){
}
public Incident(String title, String description, LocalDateTime creationDate, IncidentStatus status, List<Comment> commentList, AppUser assignedTo, AppUser createdBy, ChangeLog changeLog) {
this.title = title;
this.description = description;
this.creationDate = creationDate;
this.status = status;
this.commentList = commentList;
this.changeLog = changeLog;
}
}
评论
@Data
@NoArgsConstructor
@Entity
public class Comment {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String description;
private LocalDateTime creationDate;
@ManyToOne
private AppUser postedBy;
@ManyToOne
private Incident incident;
}
变更日志
@Data
@Entity
public class ChangeLog {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@OneToOne
private Incident incident;
@OneToMany(mappedBy = "changeLog")
private List<IncidentChange> incidentChangeList;
public ChangeLog(){
this.incidentChangeList = new ArrayList<>();
}
public ChangeLog(Incident incident, List<IncidentChange> incidentChangeList) {
this.incident = incident;
this.incidentChangeList = incidentChangeList;
}
}
事件变化
@Data
@NoArgsConstructor
@Entity
public class IncidentChange {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String description;
private LocalDateTime changeDate;
@ManyToOne
private ChangeLog changeLog;
@ManyToOne
private AppUser appUser;
}
简而言之,它是这样工作的:
AppUser 与 Incident、Comment 和 IncidentChange 具有
OneToMany 关系。
事件与 AppUser 有
多对一关系(重要的 TWICE),
OneToMany 到评论,
OneToOne 到 ChangeLog
评论与 AppUser 有
多对一关系,
ManyToOne 事件
ChangeLog 与事件具有
一对一关系,
OneToMany到IncidentChange
IncidentChange 与 ChangeLog 有
多对一关系,
ManyToOne 到 AppUser
我知道 AppUser 在 Incident 中,并且在嵌套在 Incident 中的 Comment 中,与 IncidentChange 的情况相同,但它嵌套得更深。
这是为想要检查 AppUser 和 Incident 是如何创建的人准备的代码 https://bitbucket.org/StabloPL/backendsimpleticketsystem/src/76e6bd107e68c82614fbc040b95f041fd7f51d28/src/main/java/com/djagiellowicz/ticketsystem/backendsimpleticketsystem/model/?at=masterIncidentController、AppUserControler 和 IncidentService、AppUserService 是某些人可能感兴趣的东西。
当我创建用户(通过 Postman 作为 JSON)并在之后获取它时,一切正常都没有问题。当我创建事件并将其分配给特定的人时,我无法获取事件,也无法获取该特定用户。其他页面,其中有没有创建事件的用户可以毫无问题地获取。这同样适用于没有分配 createdBy 用户的事件。一切都毫无问题地保存到数据库中。
这是当我尝试获取事件时 Hibernate/Spring 抛出的错误。当然剪了一点。
java.lang.IllegalStateException: Cannot call sendError() after the response has been committed
at org.apache.catalina.connector.ResponseFacade.sendError(ResponseFacade.java:472) ~[tomcat-embed-core-8.5.29.jar:8.5.29]
at javax.servlet.http.HttpServletResponseWrapper.sendError(HttpServletResponseWrapper.java:129) ~[tomcat-embed-core-8.5.29.jar:8.5.29]
at javax.servlet.http.HttpServletResponseWrapper.sendError(HttpServletResponseWrapper.java:129) ~[tomcat-embed-core-8.5.29.jar:8.5.29]
2018-04-24 11:39:43.731 ERROR 18300 --- [nio-8080-exec-4] 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: com.djagiellowicz.ticketsystem.backendsimpleticketsystem.model.AppUser["createdIncidentsList"]->org.hibernate.collection.internal.PersistentBag[0]->com.djagiellowicz.ticketsystem.backendsimpleticketsystem.model.Incident["createdBy"]->com.djagiellowicz.ticketsystem.backendsimpleticketsystem.model.AppUser["createdIncidentsList"]->org.hibernate.collection.internal.PersistentBag[0]->
java.lang.StackOverflowError: null
我该如何解决?我必须知道 AppUser 发布了哪些评论,这同样适用于 Incident 和 IncidentChange,我不想从 Incident/IncidentChange/Comment 中删除这些信息
最佳答案
您必须覆盖 Lombok 的注释...当您使用 @Data
时,您会使用类中的所有字段隐式调用 @EqualsAndHashCode
。无限递归从您用来映射关系的字段中产生。 @EqualsAndHashCode
在每个类中排除集合字段。例如,您可以在 AppUser 类上添加注释 @EqualsAndHashCode(exclude={"userRoleSet", "createdIncidentsList","assignedToIncidentsList","commentList","incidentChangeList"})
以覆盖 @数据
默认策略。您必须对每个模型类执行此操作,直到没有无限递归错误为止。
此外...您的类之间存在循环依赖关系。当您序列化对象时,您应该删除所有循环依赖项。最好的解决方案是序列化 DTO 而不是实体。创建一个没有循环依赖的 DTO 应该可以解决这个问题。在序列化/反序列化过程中,您可以使用包含事件列表的 AppUserDTO,这是一个不引用 AppUser 的 IncidentDTO 列表。
关于java - Hibernate : Infinite recursion,怎么解决呢?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49998868/
我正在使用 NDK 为 Android 编写一个实用程序。 在我的实用程序中,我 fork 了一个进程,并在该进程中运行以下代码: //Screenshot thread int i = 0; for
我是 React 新手,正在构建一个表单。该表单由多个组件组成的集合组成。组件之一是文本字段。 我想创建一个按钮,只需单击即可添加无限数量的相同文本字段组件。我对如何执行此操作感到困惑,并且在网上找不
我需要每 5 秒无限地写入一个文件 (.txt)这是我的代码: #include #include #include #include #include using namespace st
出于好奇,是 全部 无限循环不好? 如果您运行无限循环,会发生什么不良影响和后果? 另外,如果它们不全是坏的,您能否举一些例子,它们何时可以用于有意义的目的? 他们是否需要关闭实例?例如,我们总是在
下面是我的智能合约。当我将它放入混音中时,我会收到有关以下每个功能的警告。 函数 MedicalRecord.addNote(bytes32,bytes32) 的 Gas 要求高:无限。 函数 Med
CPDT的第三章简要讨论了为什么Coq中禁止使用负感应类型。如果我们有 Inductive term : Set := | App : term -> term -> term | Abs : (te
我有一个包含 6 个页面且启用分页的 UICollectionView 和一个 UIPageControl。我想要的是,当我来到最后一页时,如果我向右拖动,UICollectionView 会从第一页
如何以编程方式在 Excel 工作表中创建“无限”符号? 最好来自 Java...但也欢迎其他提示。 谢谢。 最佳答案 “无穷大符号”字符位于 unicode 的代码点 0x221E 中。执行此操作的
如果我想迭代值 0 到 255 并且我使用无符号字节作为计数器,当计数器达到 255 时返回到 0 并进行无限循环。 for (ubyte i = 0; i < ubyte.max; i++)
如果需要全部32位来存储从-2^31到2^31,它如何存储+和-无穷大?它使用更多内存吗?存储这些值是否良好且安全? 更新:感谢答案,我知道只有 float 据类型可以存储 Inf 值,整数不能。 最
已关闭。这个问题是 not reproducible or was caused by typos 。目前不接受答案。 这个问题是由拼写错误或无法再重现的问题引起的。虽然类似的问题可能是 on-top
在下面的设置中,如何绘制一条通过两点的“无限”线? var context = document.getElementById("canvas").getContext("2d"); var poin
我正在测试一个简单的汇编函数 (SPARC)。该函数如下,应该有两个参数,x 和 *str,并计算 x 在 *str 中出现的次数。但是,该函数会导致无限循环。我正在使用 C 来调用汇编函数,这也在下
我有很多内容要在网站上显示,因此我需要使用“无限”滚动解决方案,当用户滚动到当前加载内容的末尾时加载内容。但是,我确切地知道有多少数据,我希望用户对此有所了解。我不喜欢滚动条如何让你看起来快到内容的末
我想实现无限滚动。下面是我的布局的简短形式。因为我有一些相对定位的元素,javascript 滚动事件不会触发。 如何解决此问题才能触发滚动事件并实现无限滚动? 我的主要布局是:
关闭。这个问题是opinion-based .它目前不接受答案。 想要改进这个问题吗? 更新问题,以便 editing this post 提供事实和引用来回答它. 关闭3年前。 Improve th
如何定义类型 InfiniteFunction ,这是一个函数,调用时返回另一个 InfiniteFunction 类型看起来像: () => () => () => ... // infinite
我正在尝试为此模式创建匹配项: /page/some/thing/is/written/here 其中/page 将始终匹配 a-zA-Z0-9 并且/page 之后的所有内容都可以包含字符 a-zA
我正在使用一个“通用”js 片段,它应该检测用户是否滚动到文档底部: $(window).scroll(function() { if ($(window).scrollTop()
当我尝试初始化 Fabric ui 日期选择器字段的值时,我收到 @@redux-form/INITIALIZE 消息的无限循环 function mapStateToProps(state) {
我是一名优秀的程序员,十分优秀!