一尘不染

Json和Java-循环参考

json

我有关于通函的问题。

我有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的事情,对此我是一个新手,我认为杰克逊会自动解决此问题。


阅读 313

收藏
2020-07-27

共1个答案

一尘不染

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

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

您可以在此处查看示例。

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

更新

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

2020-07-27