Java spring mvc控制器中的无限json序列化
我有以下映射: 1.Java spring mvc控制器中的无限json序列化,java,json,spring,hibernate,jpa,Java,Json,Spring,Hibernate,Jpa,我有以下映射: 1. 以及以下dao: public Set<UserContent> getAllContent() { Session session = sessionFactory.getCurrentSession(); return new HashSet<UserContent>(session.createCriteria(UserContent.class).list()); } 结果: HTTP状态500-
以及以下dao:
public Set<UserContent> getAllContent() {
Session session = sessionFactory.getCurrentSession();
return new HashSet<UserContent>(session.createCriteria(UserContent.class).list());
}
结果:
HTTP状态500-无法写入JSON:未能延迟初始化
角色集合:com.terminal.domain.TerminalUser.companys,否
会话或会话已关闭(通过引用链:
java.util.HashSet[0]->com.terminal.domain.UserContent[“user”]->com.terminal.domain.TerminalUser[“companys”];
嵌套异常是
com.fasterxml.jackson.databind.JsonMappingException:未能延迟
初始化角色的集合:
com.terminal.domain.TerminalUser.companys,未启动任何会话或会话
闭合(通过参考链:
java.util.HashSet[0]->com.terminal.domain.UserContent[“user”]->com.terminal.domain.TerminalUser[“companys”])
附笔。
我已经阅读了下面的流行答案,但我无法解决我的问题-请帮助
自Jackson 2.0以来,您可以使用
@JsonIdentityInfo
。
检查
已更新
...
@JsonIdentityInfo(generator = ObjectIdGenerators.IntSequenceGenerator.class, property = "@id")
public class Content {
...
}
...
@JsonIdentityInfo(generator = ObjectIdGenerators.IntSequenceGenerator.class, property = "@id")
public class UserContent {
...
}
更新:
关于无限递归。
你有双向关系,对吗?想象一下json转换了您的
内容实体类,则它具有userContent字段和
UserContent实体类它也有一个内容字段,然后它将
结果无限递归这就是为什么您将@JsonIgnore放在
UserContent字段忽略该字段以避免无限递归。-第二
我打赌你有私人上市公司代码>在内容实体类中
我赌输了。XD:))
基于这一行
HTTP Status 500 - Could not write JSON: failed to lazily initialize a collection of role: com.terminal.domain.TerminalUser.companys,
只需在private List companys中将fetchType设置为Eager
或只是使用Hibernate.initialized()初始化它
有关更多说明,请参阅此链接 UserContent有TerminalUser字段,TerminalUser有List,但我不明白它与JsonIgnorethats有什么关系。为什么你会得到lazyinitialization异常。顺便说一句,你没有初始化TerminalUser对象上的公司列表。@jsonIgnore用于忽略实体类中的某些字段,这也是用来避免无限递归
。你得到了lazyinitialization异常,因为json试图转换对象/实体类上的所有相关字段,而json发现列表尚未初始化。如果你不需要列表
,只需放置@JsonIgnore alsoI,我几周前刚刚遇到同样的问题,这就是我发现的。是的,你知道这个问题,但它是在添加注释@JsonIgnoreCan后才出现的。你能提供更详细的答案吗?
import com.fasterxml.jackson.annotation.JsonIgnore;
public class Content {
...
@OneToOne(fetch = FetchType.LAZY, mappedBy = "content", cascade = CascadeType.ALL)
@JsonIgnore //added this annotation
UserContent userContent;
....
...
@JsonIdentityInfo(generator = ObjectIdGenerators.IntSequenceGenerator.class, property = "@id")
public class Content {
...
}
...
@JsonIdentityInfo(generator = ObjectIdGenerators.IntSequenceGenerator.class, property = "@id")
public class UserContent {
...
}
HTTP Status 500 - Could not write JSON: failed to lazily initialize a collection of role: com.terminal.domain.TerminalUser.companys,