美文网首页后端
解决Jackson序列化Hibernate对象问题

解决Jackson序列化Hibernate对象问题

作者: zerouwar | 来源:发表于2017-08-16 11:13 被阅读583次

    相信这个问题只要在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),这应该也算是一个冲突?依然在寻找方案中....

    相关文章

      网友评论

        本文标题:解决Jackson序列化Hibernate对象问题

        本文链接:https://www.haomeiwen.com/subject/yztirxtx.html