Json 无法初始化代理-没有会话
大家好, 我花了相当长的时间从JSON 1升级到JSON 2,但当我尝试返回一个实体列表时,我得到了一个例外: “收到的异常无法写入JSON:无法初始化代理-无会话(通过引用链:” 我知道这与Hibernate lazy init有关,但我还没有找到解决方法。我原以为jackson模块Hibernate项目就是解决方案。但是我一直没能让它工作 这是我的技术:Json 无法初始化代理-没有会话,json,spring,hibernate,jackson,Json,Spring,Hibernate,Jackson,大家好, 我花了相当长的时间从JSON 1升级到JSON 2,但当我尝试返回一个实体列表时,我得到了一个例外: “收到的异常无法写入JSON:无法初始化代理-无会话(通过引用链:” 我知道这与Hibernate lazy init有关,但我还没有找到解决方法。我原以为jackson模块Hibernate项目就是解决方案。但是我一直没能让它工作 这是我的技术: 弹簧:3.2.1释放 Hibernate 4.1.7.1最终版本 杰克逊2 jackson core 2.0.4 jackson数据绑定
- 弹簧:3.2.1释放
- Hibernate 4.1.7.1最终版本
- 杰克逊2
- jackson core 2.0.4
- jackson数据绑定:2.0.4
- jackson-datatype-hibernate4:2.1.2
public class HibernateAwareObjectMapper extends ObjectMapper {
public HibernateAwareObjectMapper() {
Hibernate4Module hm = new Hibernate4Module();
registerModule(hm);
}
}
流程从控制器开始,控制器调用多个服务,每个服务返回一个实体或列表。然后,我将返回的对象放入一个对象中并返回它,认为@ResponseBy可以工作。但是,我不能让事情正常进行,因为我仍然得到异常
有人能在这里看到错误吗
非常感谢……这是因为您尝试序列化的对象具有延迟加载的组件,您可以添加到web配置中以解决此问题 当事务中存在执行时,用于加载对象的hibernate会话将关闭,因此当视图层(jackson)尝试序列化对象并尝试加载延迟加载的对象时,它将失败,并出现此错误 将此添加到web.xml中
<filter>
<filter-name>hibernateFilter</filter-name>
<filter-class>org.springframework.orm.hibernate3.support.OpenSessionInViewFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>hibernateFilter</filter-name>
<url-pattern>/app/*</url-pattern>
</filter-mapping>
冬眠过滤器
org.springframework.orm.hibernate3.support.OpenSessionInViewFilter
冬眠过滤器
/应用程序/*
这在jackson数据类型hibernate的2.5.0版本中得到了解决。只需在hibernate(3,4)模块中传递hibernate SessionFactory,如下所示:
public class HibernateAwareObjectMapper extends ObjectMapper {
private static final long serialVersionUID = 1L;
@Autowired
private EntityManagerFactory emf;
@PostConstruct
public void init() {
Hibernate4Module module = new Hibernate4Module(emf.unwrap(SessionFactory.class));
module.enable(Hibernate4Module.Feature.FORCE_LAZY_LOADING);
module.disable(Hibernate4Module.Feature.USE_TRANSIENT_ANNOTATION);
}}
若JPA正在使用,上面的代码段就可以了,所以EntityManagerFactorybean是可用的。否则,只需注入Hibernate SessionFactory并传递给构造函数
无需使用OpenSessionInView模式。Awesome.可从hibernate 4、jpa 2.0使用,数据类型为2.6.0。但是,您应该使用EntityManager.unwrap(HibernateEntityManager.class).getSession().getSessionFactory(),而不是emf.unwrap(HibernateEntityManager.class).getSession().getSessionFactory(),因为emf.unwrap仅在jpa 2.1之后才可用(但未选中)。
public class HibernateAwareObjectMapper extends ObjectMapper {
private static final long serialVersionUID = 1L;
@Autowired
private EntityManagerFactory emf;
@PostConstruct
public void init() {
Hibernate4Module module = new Hibernate4Module(emf.unwrap(SessionFactory.class));
module.enable(Hibernate4Module.Feature.FORCE_LAZY_LOADING);
module.disable(Hibernate4Module.Feature.USE_TRANSIENT_ANNOTATION);
}}