2013-03-15 99 views
4

好日子所有, 我花了相當長的時間Googlin'升級從JSON 1至JSON 2,但是當我試圖返回實體的名單,我得到異常:無法初始化代理 - 沒有會話

「收到異常無法寫入JSON:無法初始化代理 - 沒有會話(通過參考鏈:」

我知道這與Hibernate懶惰初始化有關,但我還沒有想出如何解決它。 -module-hibernate項目是解決方案,但是我一直無法實現它。

這是我的技術:

  • 彈簧:3.2.1RELEASE
  • 休眠4.1.7.Final
  • 傑克遜2
  • 傑克遜核2.0.4
  • 傑克遜 - 數據綁定:2.0.4
  • 傑克遜 - 數據類型-hibernate4:2.1.2

我正在使用Java配置: ...

@Bean 
public com.mycompany.config.MappingJackson2HttpMessageConverter mappingJackson2HttpMessageConverter() { 
    MappingJackson2HttpMessageConverter mappingJackson2HttpMessageConverter = new MappingJackson2HttpMessageConverter(); 
    mappingJackson2HttpMessageConverter.setObjectMapper(new HibernateAwareObjectMapper()); 
    return mappingJackson2HttpMessageConverter; 
} 

@Bean 
public OpenEntityManagerInViewFilter springOpenEntityManagerInViewFilter() { 
return new org.springframework.orm.jpa.support.OpenEntityManagerInViewFilter(); 
} 

@Bean 
public ContentNegotiatingViewResolver contentNegotiatingViewResolver() { 
final ContentNegotiatingViewResolver contentNegotiatingViewResolver = new ContentNegotiatingViewResolver(); 
contentNegotiatingViewResolver.setDefaultContentType(MediaType.APPLICATION_JSON); 
final ArrayList defaultViews = new ArrayList(); 
defaultViews.add(converter()); 
contentNegotiatingViewResolver.setDefaultViews(defaultViews); 
    return contentNegotiatingViewResolver; 
} 

我也有:

public class HibernateAwareObjectMapper extends ObjectMapper { 

public HibernateAwareObjectMapper() { 
    Hibernate4Module hm = new Hibernate4Module(); 
    registerModule(hm); 
} 
} 

流從控制器,它調用幾個服務,每個返回的實體或列表開始。然後我把返回的對象放到一個對象中並返回它,認爲@ResponseBody會起作用。但是,由於我仍然得到例外,所以我不能將事情連線好。

任何人都可以在這裏看到任何錯誤?

感激......

回答

1

這是因爲你試圖序列化對象有懶加載組件,您可以添加OpenSessionInViewFilter到您的網絡配置,以解決這個問題。

當執行存在事務時,用於加載對象的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> 
3

這在2.5.0版本傑克遜的數據類型,休眠的解決增加這個。只是通過Hibernate的SessionFactory在Hibernate中(3,4)模塊如下:

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在使用,所以EntityManagerFactory的豆可用。否則,只需注入Hibernate SessionFactory並傳遞給構造函數。

不需要使用OpenSessionInView模式。

+0

太棒了。從休眠4,jpa 2.0與數據類型2.6.0工作。但是,不應該使用emf.unwrap,而應該使用EntityManager.unwrap(HibernateEntityManager.class).getSession()。getSessionFactory(),因爲emf.unwrap僅在jpa 2.1之後纔可用(儘管沒有檢查它)。 – 2015-07-29 15:40:23

相關問題