相信這個問題只要在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),這應該也算是一個沖突?依然在尋找方案中....