我尝试使用多个延迟加载的属性序列化对象,并且我收到以下错误:
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时,应用程序正常工作。
答案 0 :(得分:1)
问题与以下事实有关:当您执行查询而不使用FetchType.EAGER时,主要对象的相关对象并未真正加载。通过使用FetchType.EAGER,您告诉hibernate:加载主实体和所有相关实体;这可能没有多大意义(你可以冒险在一个查询中加载所有数据库) 返回杰克逊marshaller,当对象被“代理”时,它无法序列化它们 恕我直言,我会做以下事情: 我要创建一个要序列化的DTO对象(我不会序列化Hibernate对象) 我只在这个DTO中放入了所需的属性和数据 如果用户需要查看相关对象,将执行特定调用,并且将从DB加载与所选对象相关的数据并将其序列化(在特定DTO对象中)