Json Spring MVC:无法初始化代理-无会话(通过引用链)

Json Spring MVC:无法初始化代理-无会话(通过引用链),json,spring,Json,Spring,类型异常报告 消息无法写入内容:未能延迟初始化角色集合:edu.waa.classified.dto.User.products,无法初始化代理-无会话(通过引用链:java.util.ArrayList[0]->edu.waa.classified.dto.User[“products”]);嵌套异常为com.fasterxml.jackson.databind.JsonMappingException:未能延迟初始化角色集合:edu.waa.classified.dto.User.produ

类型异常报告

消息无法写入内容:未能延迟初始化角色集合:edu.waa.classified.dto.User.products,无法初始化代理-无会话(通过引用链:java.util.ArrayList[0]->edu.waa.classified.dto.User[“products”]);嵌套异常为com.fasterxml.jackson.databind.JsonMappingException:未能延迟初始化角色集合:edu.waa.classified.dto.User.products,无法初始化代理-无会话(通过引用链:java.util.ArrayList[0]->edu.waa.classified.dto.User[“products”])

说明服务器遇到内部错误,无法满足此请求


我刚刚在
@manytomy(fetch=FetchType.LAZY,cascade=CascadeType.ALL)
注释之后添加了
@JsonIgnore

它起作用了,但不确定为什么起作用

@ManyToMany(fetch = FetchType.LAZY, cascade = CascadeType.ALL)
@JoinTable(name = "WISHLIST", joinColumns = {
@JoinColumn(name = "userId", referencedColumnName = "id") }, inverseJoinColumns = {
@JoinColumn(name = "productId", referencedColumnName = "id") })
@JsonIgnore
private List<Product> products;
@ManyToMany(fetch=FetchType.LAZY,cascade=CascadeType.ALL)
@JoinTable(name=“WISHLIST”,joinColumns={
@JoinColumn(name=“userId”,referencedColumnName=“id”)},inverseJoinColumns={
@JoinColumn(name=“productId”,referencedColumnName=“id”)}
@杰索尼奥雷
私人上市产品;

我猜您的控制器已退出休眠会话。(否@事务性)。但是您的json列表希望在该会话之外填充。但hibernate中填充的是代理而不是真实数据,在hibernate会话之外,当您尝试访问时,它无法加载该数据。JsonIgnore不需要这些数据,所以它可以工作。或者,如果您希望json对象中包含该数据,请执行fetchtype。然后休眠并立即加载它们。若您只想在特殊情况下使用该列表,请将其保留为惰性,然后在服务层上以一种特殊的方法访问它,该方法具有annotation@transactional。然后hibernate就可以填充这个列表了

问题在于FetchType.lazy。当Jackson转换用户实体时,它尝试加载产品,但hibernate会话关闭

因此,添加@JsonIgnore是解决这个问题的一种方法,但是当您需要返回产品时,这是没有选择的

我找到了这个答案,它为我解决了同样的问题,并为我提供了延迟加载类型:


这个解决方案的好处是,您仍然可以对产品使用延迟加载。

我也遇到了同样的问题。我刚刚将下面的注释添加到我的实体类中(就在实体类之前)。这是肯定的

@Entity @Table(name="Country") @Proxy(lazy = false) public class Country {}

请在应用程序试图获取产品列表以在会话关闭后形成json对象之前发布一些代码。现在您要告诉Json解析器忽略产品列表,在构造Json响应时不要尝试填充。所以NP。