相信这个问题只要在spring中用过hibernate/JPA的同学都遇到过,网上一堆方案
-
大多数方案都是说在实体上加@JsonIgnoreProperties然后忽略掉hibernate的代理对象中用于懒加载的两个属性(handler和hibernateLazyInitializer),这种方案在实体不多的时候可行,但是对于强迫症的我总觉得这不是最好的方案,至少这真的是最次方案,毕竟这应该是一个全局问题,而不是用局部方案来解决。
-
后来谷歌和stf搜到的第二种方案是配置jackson的序列化策略,这算是全局配置了,通过往
ObjectMapper
里面设置SerializationFeature
的FAIL_ON_EMPTY_BEANS,默认是true,也就是jackson找不到该属性序列化器的时候会抛出异常,也就导致序列化失败的原因,通过设置为false来规避序列化这种fail-fast机制(打个比方ヾ( ̄▽ ̄)),序列化问题算是在全局上解决了,看起来算是最好方案了。 -
其实在第二种方案搜索的过程也看到说,自己为那两个hibernate代理属性写序列化器来忽略它们,其实这种应该才是最好的方案(关于这种方案,其实用起来不难,自己往spring ioc中注册一个自定义的objectMapper就可以了,不过懒....)。第二种方案在运用的过程中发现,虽然序列化如期成功了,但是会发现序列化后的json会出现handler和hibernateLazyInitializer,效果是这样的
"handler": {}, "hibernateLazyInitializer": {}
这种作为自从做了程序员强迫症从无到有,再到日益严重的我简直无法忍受。然后意外看到其实jackson有一个模块功能是针对hibernate做了这方面的工作,这对于java程序员这种伸手党简直福音- -
无脑到什么程度呢?加个依赖就好了....
<dependency>
<groupId>com.fasterxml.jackson.datatype</groupId>
<artifactId>jackson-datatype-hibernate5</artifactId>
<version>2.9.0</version>
</dependency>
jackson有个Jackson2DatatypeHelper
类会检查hibernate5组件是否存在classpath中,如果存在就会激活。老实说这种技术真的是很亮瞎狗眼。
我在用spring data rest,貌似hibernate5Module对序列化的json格式做了变换(多了一层content),这应该也算是一个冲突?依然在寻找方案中....
网友评论