Spring MVC中的Jackson序列化和延迟加载

时间:2015-05-06 14:38:03

标签: json spring hibernate jpa jackson

我尝试使用多个延迟加载的属性序列化对象,并且我收到以下错误:

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 个答案:

答案 0 :(得分:1)

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