当前位置: 首页 > 面试题库 >

Json和Java-循环参考

汤嘉平
2023-03-14
问题内容

我有关于通函的问题。

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

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

这些对象是由Hibernate Code
Generation自动生成的,我需要在后端使用循环引用,我只需要删除它,然后再使用Jackson将信息发送到前端即可。

控制器方法标头为:

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

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


问题答案:

有两种方法可以解决此问题。如果您必须将实体暴露给外界,建议添加@JsonIgnore导致循环引用的属性。这将告诉杰克逊不要序列化该属性。

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

您可以在此处查看示例。

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

更新

这是一个很好的博客文章在这里是进入你能处理杰克逊双向关系的各种方式的细节。它描述的解决方案,使用@JsonIgnore@JsonManagedReference@JsonBackReference@JsonIdentityInfo@JsonView和自定义序列为好。这是您可以使用的各种技术的非常全面的文章。



 类似资料:
  • 我有圆形参考的问题。 我有Rest Webservices,它会将对象返回到前端,问题是当我试图返回具有多个引用的对象时,结果会得到无限的响应,从而生成 这些对象是由Hibernate代码生成自动生成的,我需要在后端有循环引用,我只需要在使用Jackson将信息发送到前端之前删除它。 控制器方法标头为: 我没有做任何明确的事情来转换为杰克逊,我是一个新手,我认为杰克逊自动解决了这个问题。

  • 问题内容: 我正在尝试遍历以下内容 我到目前为止所得到的: 有任何想法吗? 问题答案: 在您的代码中,元素是JSON对象的数组,而不是JSON对象本身。元件,和是JSON的一部分内部对象JSON阵列。 您需要遍历数组 版画 我不知道您的代码片段来自何处。

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

  • 问题内容: 我正在学习python,我像这样循环循环,将json转换为字典:它可以工作,但这是正确的方法吗?谢谢 :) 这里的JSON: 这里输出: 问题答案: 总体看来还不错。 无需先读取文件,然后使用负载。您可以直接使用负载。 为此,使用i和k是不正确的。它们通常仅应用于整数循环计数器。在这种情况下,它们是关键,因此更合适的方法会更好。也许重命名为和为?传达更多信息的东西将更易于阅读和维护。

  • 问题内容: 下面是我的控制器,它从sql db中读取数据,然后尝试将结果编码为JSON并将数据发送回我的gridview.js 这就是问题所在,使用上面的代码,我在执行gridview.js时得到了没有数据的gridview表,但是如果我直接访问控制器的方法是这样的 我得到这个错误, 序列化类型为’System.Globalization.CultureInfo’的对象时,检测到循环引用。 说明:

  • 问题内容: 我开始在一个小型的足球联赛管理网站上工作(主要是出于学习目的),我无法确定Django模型的关系。为了简单起见,假设我有两种类型的对象-玩家和团队。自然,一个玩家属于一个团队,因此在Player模型中就是一个ForeignKey(Team)。所以我去: 然后,我希望每个团队都有一个队长,该队长将是其中一名球员,因此在团队模型中将成为一名ForeignKey(Player)。但这会产生循