大多数方案都是说在实体上加@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程序员这种伸手党简直福音- -

无脑到什么程度呢?加个依赖就好了….

hibernate5

hibernate4

<dependency>
<groupId>com.fasterxml.jackson.datatype</groupId>
<artifactId>jackson-datatype-hibernate4</artifactId>
<version>2.9.8</version>
</dependency>

jackson有个Jackson2DatatypeHelper类会检查hibernate5组件是否存在classpath中,如果存在就会激活。老实说这种技术真的是很亮瞎狗眼。