SpringBoot2.X整合JPA/Hibernate过程中出现的问题,如下所示:
No serializer found for class org.hibernate.proxy.pojo.javassist.JavassistLazyInitializer
and no properties discovered to create BeanSerializer
(to avoid exception, disable SerializationConfig.Feature.FAIL_ON_EMPTY_BEANS)
问题背景为使用jackjson将对象json化的时候出现的错误。
解决办法一
在实体类上面加上注解:
@JsonIgnoreProperties(value = {"handler","hibernateLazyInitializer","fieldHandler"})
解决办法二
注册一个objectMapper覆盖掉默认的,这样就不用在每个类上面使用@JsonIgnoreProperties
:
@Bean
public ObjectMapper objectMapper() {
return new ObjectMapper().disable(SerializationFeature.FAIL_ON_EMPTY_BEANS);
}
// ObjectMapper为com.fasterxml.jackson.databind.ObjectMapper;
测试结果如下:
对比解决方法一,在解析单个对象时返回的json中多了两个字段handler和hibernateLazyInitializer。
解决方法三
不使用SpringBoot默认的jackson进行对象json化,手动使用其他json框架如fastJSON进行json化然后返回。
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.47</version>
</dependency>
解决方法四
参考博文:Jackson注册Hibernate4Module模块。
不过我未测试成功。
解决方法五
类似于解决方法二也是在配置类里面注册bean,不同的是这次替换的不是objectMapper,而是Jackson2ObjectMapperBuilderCustomizer。
实例代码如下(注意解决方法二也是在配置类里面):
@Configuration
public class MyConfig {
@Bean
Jackson2ObjectMapperBuilderCustomizer jackson2ObjectMapperBuilderCustomizer(){
return new Jackson2ObjectMapperBuilderCustomizer() {
@Override
public void customize(Jackson2ObjectMapperBuilder jacksonObjectMapperBuilder) {
jacksonObjectMapperBuilder.featuresToDisable(SerializationFeature.FAIL_ON_EMPTY_BEANS);
}
};
}
}
该种办法是看到一楼评论小伙伴说的,我就给大家总结下。另外,刚才新建项目SpringBoot整合jpa,在不进行任何配置下并未出现上述错误。SpringBoot版本是2.2.1.RELEASE
。