Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Json 无法初始化代理-没有会话_Json_Spring_Hibernate_Jackson - Fatal编程技术网

Json 无法初始化代理-没有会话

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数据绑定

大家好, 我花了相当长的时间从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数据绑定:2.0.4
  • jackson-datatype-hibernate4:2.1.2
我正在使用Java配置:

我还有:

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);
}}