2015-05-06 30 views
0

我试图序列与几个延迟加载属性的对象,而我得到了以下错误:杰克逊系列化和延迟加载在Spring MVC

Could not write content: No serializer found for class org.hibernate.proxy.pojo.javassist.JavassistLazyInitializer and no properties discovered to create BeanSerializer (to avoid exception, disable SerializationFeature.FAIL_ON_EMPTY_BEANS) 

经过一番搜索我已经试过这是我的@Configuration类,但它似乎没有帮助:

@Bean 
public ObjectMapper objectMapper() { 
    ObjectMapper objectMapper = new ObjectMapper(); 
    Hibernate4Module hibernateModule = new Hibernate4Module(); 
    hibernateModule.configure(Hibernate4Module.Feature.FORCE_LAZY_LOADING, false); 
    objectMapper.registerModule(hibernateModule); 
    return objectMapper; 
} 

@Bean 
public MappingJackson2HttpMessageConverter mappingJackson2HttpMessageConverter() { 
    MappingJackson2HttpMessageConverter converter = new MappingJackson2HttpMessageConverter(); 
    converter.setObjectMapper(objectMapper()); 
    return converter; 
} 

当我更改为FetchType.EAGER应用程序工作正常。

回答

1

的问题是关系到一个事实,即在主一个相关的对象,当你执行查询,而不是使用FetchType.EAGER是不是真的装;通过使用FetchType.EAGER,您可以告诉hibernate:加载主实体和所有相关实体;这可能没有太多的感觉(你可能需要承担加载所有的数据库在一个查询) 回到杰克逊编组,当对象被“代理”,它是不能够在它们的序列化恕我直言 我会做到以下几点: 我倒是创建要序列化对象DTO(我不序列休眠对象) 我把这个DTO会只有需要的属性和数据,如果用户需要查看相关对象 一个特定的呼叫会被执行,并且相关数据所选择的对象将从数据库加载和序列化(在特定的DTO对象)

+0

使用的DTO确实是另一种选择,但我想的东西更自动化的方式来工作。 Hibernate4Module应该可以解决这个问题,但它有点不适合我。 – user3170702

+0

恕我直言,我会使用的DTO的做法,我会用户休眠发电产品,这样就可以使用预测为了利用变压器只选择查询所需字段,然后包裹结果的DTO(如org.hibernate作为.transform.Transformers.aliasToBean(Class targetClass) –