相信這個(gè)問題只要在spring中用過hibernate/JPA的同學(xué)都遇到過,網(wǎng)上一堆方案
大多數(shù)方案都是說在實(shí)體上加@JsonIgnoreProperties然后忽略掉hibernate的代理對(duì)象中用于懶加載的兩個(gè)屬性(handler和hibernateLazyInitializer)藕畔,這種方案在實(shí)體不多的時(shí)候可行庵朝,但是對(duì)于強(qiáng)迫癥的我總覺得這不是最好的方案鳞尔,至少這真的是最次方案彼念,畢竟這應(yīng)該是一個(gè)全局問題狞尔,而不是用局部方案來解決笙蒙。
后來谷歌和stf搜到的第二種方案是配置jackson的序列化策略,這算是全局配置了聚唐,通過往
ObjectMapper
里面設(shè)置SerializationFeature
的FAIL_ON_EMPTY_BEANS,默認(rèn)是true丐重,也就是jackson找不到該屬性序列化器的時(shí)候會(huì)拋出異常腔召,也就導(dǎo)致序列化失敗的原因杆查,通過設(shè)置為false來規(guī)避序列化這種fail-fast機(jī)制(打個(gè)比方ヾ( ̄▽ ̄)),序列化問題算是在全局上解決了臀蛛,看起來算是最好方案了亲桦。-
其實(shí)在第二種方案搜索的過程也看到說,自己為那兩個(gè)hibernate代理屬性寫序列化器來忽略它們浊仆,其實(shí)這種應(yīng)該才是最好的方案(關(guān)于這種方案客峭,其實(shí)用起來不難,自己往spring ioc中注冊一個(gè)自定義的objectMapper就可以了抡柿,不過懶....)舔琅。第二種方案在運(yùn)用的過程中發(fā)現(xiàn),雖然序列化如期成功了洲劣,但是會(huì)發(fā)現(xiàn)序列化后的json會(huì)出現(xiàn)handler和hibernateLazyInitializer备蚓,效果是這樣的
"handler": {}, "hibernateLazyInitializer": {}
這種作為自從做了程序員強(qiáng)迫癥從無到有,再到日益嚴(yán)重的我簡直無法忍受囱稽。然后意外看到其實(shí)jackson有一個(gè)模塊功能是針對(duì)hibernate做了這方面的工作郊尝,這對(duì)于java程序員這種伸手黨簡直福音- -
無腦到什么程度呢?加個(gè)依賴就好了....
<dependency>
<groupId>com.fasterxml.jackson.datatype</groupId>
<artifactId>jackson-datatype-hibernate5</artifactId>
<version>2.9.0</version>
</dependency>
jackson有個(gè)Jackson2DatatypeHelper
類會(huì)檢查hibernate5組件是否存在classpath中战惊,如果存在就會(huì)激活流昏。老實(shí)說這種技術(shù)真的是很亮瞎狗眼。
我在用spring data rest吞获,貌似hibernate5Module對(duì)序列化的json格式做了變換(多了一層content)况凉,這應(yīng)該也算是一個(gè)沖突?依然在尋找方案中....