当前位置: 首页 > 知识库问答 >
问题:

Json和Java——循环引用

谭繁
2023-03-14

我有圆形参考的问题。

我有Rest Webservices,它会将对象返回到前端,问题是当我试图返回具有多个引用的对象时,结果会得到无限的响应,从而生成

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

这些对象是由Hibernate代码生成自动生成的,我需要在后端有循环引用,我只需要在使用Jackson将信息发送到前端之前删除它。

控制器方法标头为:

@RequestMapping(value="/list", method=RequestMethod.POST)
public @ResponseBody eventResponse list(@RequestBody String sessionID) {

我没有做任何明确的事情来转换为杰克逊,我是一个新手,我认为杰克逊自动解决了这个问题。

共有3个答案

左丘修齐
2023-03-14

@JsonbTransient解决了我对handel循环引用的问题:

@JsonbTransient // javax.json.bind.annotation.JsonbTransient
@ManyToOne
@JoinColumn(name = "userId", referencedColumnName = "id", nullable = false)
public AContainedEntity getAContainedEntity() {
       return aContainedEntity;
}
邹丰羽
2023-03-14

一个注释@JsonIdtyInfo解决了这个问题。它还处理循环引用。参考

燕志学
2023-03-14

有两种方法可以解决这个问题。如果您必须向外界公开您的实体,我建议在导致循环引用的属性上添加@JsonIgnore。这将告诉Jackson不要序列化该属性。

另一种方法是使用Jackson提供的双向功能。您可以使用@JsonManagedReference@JsonBackReference@JsonManagedReference是属性的“转发”部分,它将正常序列化@JsonBackReference是引用的“back”部分;它不会被序列化,但在反序列化“forward”类型时将被重建。

您可以在此处查看示例。

这回应了您的评论:我认为在这种情况下您可能想要做的是使用对外界可见的DTO。我喜欢这种方法,因为我不想将我的实体暴露给外界。这意味着Jackson注释将在DTO上而不是在enity上。您需要某种映射器或转换器来将实体转换为DTO。现在,当您对实体进行更改时,除非您修改映射器/转换器,否则它们不会传播到DTO。我认为这是可以的,因为当您对实体进行更改时,您可以决定是否要公开该更改。

使现代化

这里有一篇很好的博客文章,详细介绍了在Jackson中处理双向关系的各种方法。它描述了使用@JsonIgnore@JsonManagedReference@JsonBackReference@JsonIdentityInfo@JsonView以及自定义序列化程序的解决方案。这是一本相当全面的书,包含了各种可以使用的技术。

 类似资料:
  • 问题内容: 我有一个对象,该对象具有对另一个对象的循环引用。考虑到这些对象之间的关系,这是正确的设计。 为了显示 不出所料,当我尝试使用Json序列化计算机或客户对象时遇到了一个问题。我不确定是如何解决此问题的,因为我不想破坏计算机和客户对象之间的关系。解决此问题有哪些选择? 编辑 目前,我正在使用Controller基类提供的Json方法。因此,我正在做的序列化基本如下: 问题答案: 更新: 不

  • 问题内容: 我有关于通函的问题。 我有Rest Webservices,它会将对象返回到前端,问题是当我尝试返回具有多个引用的对象时,结果是我得到一个无限的响应,该响应会生成 这些对象是由Hibernate Code Generation自动生成的,我需要在后端使用循环引用,我只需要删除它,然后再使用Jackson将信息发送到前端即可。 控制器方法标头为: 我没有做任何明确的转换为Json的事情,

  • 问题内容: 在正在进行的项目中,人们编写了服务类来访问DAO。几乎每个业务对象都具有使用自己的DAO的自己的服务。在某些服务上,我们使用对其他服务的引用。目前,人们正在实例化构造函数内部所需的服务。 但是现在,我遇到了麻烦,因为服务A需要服务B而服务B需要服务A,因此对任一构造函数的调用都会导致堆栈溢出… 示例(伪代码): 您将如何解决?使用单例模式? 谢谢 问题答案: Spring框架通过使用依

  • 问题内容: 给定一个以复杂的,循环的方式相互引用的类实例的集合:垃圾收集器是否可能无法释放这些对象? 我隐约记得过去这是JVM中的问题,但我 认为 这在几年前已解决。但是,在jhat中进行的一些调查显示,循环引用是我现在面临的内存泄漏的原因。 注意:我一直给人以JVM能够解析循环引用并从内存中释放这种“垃圾岛”的印象。 但是,我提出这个问题只是为了看看是否有人发现了任何异常。 问题答案: 循环引用

  • 问题内容: 如果我从json.net获得序列化的JSON,如下所示: 我想让淘汰赛在FooList上输出foreach,但是我不确定如何继续,因为$ ref东西可能会抛出东西。 我在想解决方案将以某种方式通过不使用以下方式强制将所有Foos呈现在FooList中: 但这似乎很浪费。 问题答案: 从服务器接收的json对象包含循环引用。在使用对象之前,您必须首先 从对象中删除所有属性,这意味着`$r

  • 使用MySQL、Java、Spring Boot和JPA 我有两个对象,用户和模块。 一个用户可以有多个模块,一个模块可以有多个用户。 模块的结构如下: 用户的结构如下: 在调用模块时,使用@JsonIgnore注释确实“起作用”,但理想情况下,我还需要调用用户及其模块。有什么建议可以支持这两种方法,而不会因循环引用而崩溃?