Struts2在打包json格式的懶加載異常問題
Hibernate中如果出現(xiàn)了級聯(lián)查詢,就可能出現(xiàn)懶加載問題,比如我現(xiàn)在有個Account(管理員)類、Category(商品類別)和Product(商品)類,從左到右都是一對多的關(guān)系,而且從右到左都是設(shè)置了@ManyToOne(fetch=FetchType.LAZY)。我現(xiàn)在要把商品信息查出來打包成json格式傳到前臺,我在后臺使用查詢語句為:
from Product p left join fetch p.category where p.name like:name
這樣就可以把Product查出來了,然后Product中的Category也放進(jìn)去了,但是Category中的Account不是實際對象,是暫時的代理對象,這點很好理解,因為我就查了Product而且只級聯(lián)了Category,至于Category和Account就根據(jù)實際配置了(LAZY)。
現(xiàn)在將查詢出來的product放到Map中,然后轉(zhuǎn)成json格式返回到前臺肯定會出現(xiàn)懶加載問題,因為在轉(zhuǎn)json的過程中會拿Account對象,但是此時session已經(jīng)關(guān)閉了,所以會報錯,有個很直接但是不太好的解決辦法就是將Category中的LAZY改成EAGER,這樣就能把Account的信息也查出來,但是這樣不好。所以我們用另一種辦法:在struts.xml中設(shè)置一下黑名單,在轉(zhuǎn)json格式的時候使用正則表達(dá)式將category中的account過濾掉,就不會去查account對象了,就不會有懶加載問題了。如下:
到這里,應(yīng)該就沒問題了。但是在我的項目中還是報懶加載異常,也就是說我這樣配置后根本沒有起作用。但是理論上,這樣配置后就OK了,就可以正常的把數(shù)據(jù)打包成json格式傳給前臺了。這問題困擾了我2天,后來索性先將LAZY改成EAGER,先把項目往下做。
今天我在另一個Hibernate異常中,聯(lián)系到了這里的異常,解決了!Hibernate中今天我要調(diào)用get方法獲取商品的信息,無法獲取到,后臺的控制臺沒有任何消息,由于我開啟了dev模式,前臺顯示了錯誤信息:
java.lang.ClassCastException:cn.it.shop.model.Product_$$_javassist_0 cannot be cast to javassist.util.proxy.Proxy</span>
無法轉(zhuǎn)成代理??為啥要轉(zhuǎn)成代理呢?一般不都是代理無法轉(zhuǎn)成實際對象么?于是我上網(wǎng)搜索了一下,這個問題可能是由于項目中的一個javassist的jar包沖突了,我去工程中檢查一下,果不其然:
還真的沖突了喲喂……于是刪掉struts包中的那個javassist-3.11.0.GA.jar即可,Hibernate這邊沒錯了,可以正常拿出商品信息了。然后我聯(lián)想到了2天前struts2轉(zhuǎn)json的問題,于是回去將EAGER改回LAZY,問題也沒了,也能正常轉(zhuǎn)json了,郁悶,還真是jar包沖突惹的禍。因為當(dāng)時根本沒有報錯,只是前臺那邊我查不到返回的json數(shù)據(jù),只知道沒有返回json數(shù)據(jù),肯定是后臺轉(zhuǎn)json出了問題,根據(jù)已有的經(jīng)驗,90%是懶加載的問題,但是沒想到是jar包沖突惹的禍。
后話:如果jar包沒沖突,但是無法轉(zhuǎn)json,那基本上是懶加載惹的禍,利用struts.xml中配置黑名單的方式將懶加載的對象過濾掉的方法很實用,不用修改POJO中的配置,我想把哪些字段轉(zhuǎn)到j(luò)son中就轉(zhuǎn)哪些,不想就不轉(zhuǎn),很方便。
原文鏈接:http://blog.csdn.net/eson_15/article/details/51394302
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- 詳解Struts2中json 相互引用死循環(huán)解決辦法
- Json在Struts中的轉(zhuǎn)換與傳遞方法
- 在Action中以Struts2的方式輸出JSON數(shù)據(jù)的實例
- 將json轉(zhuǎn)換成struts參數(shù)的方法
- struts2通過action返回json對象
- Struts2 Result 返回JSON對象詳解
- struts2+jquery+json實現(xiàn)異步加載數(shù)據(jù)(自寫)
- ajax+json+Struts2實現(xiàn)list傳遞實例講解
- 在Struts2中如何將父類屬性序列化為JSON格式的解決方法
- struts json 類型異常返回到j(luò)s彈框問題解決辦法
相關(guān)文章
基于Elasticsearch5.4的常見問題總結(jié)
下面小編就為大家分享一篇基于Elasticsearch5.4的常見問題總結(jié),具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-01-01springboot項目整合mybatis并配置mybatis中間件的實現(xiàn)
這篇文章主要介紹了springboot項目整合mybatis并配置mybatis中間件的實現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-04-04IntelliJ IDEA快速創(chuàng)建getter和setter方法
這篇文章主要介紹了IntelliJ IDEA快速創(chuàng)建getter和setter方法,本文通過圖文實例相結(jié)合給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-03-03Java結(jié)構(gòu)型設(shè)計模式之適配器模式詳解
適配器模式,即將某個類的接口轉(zhuǎn)換成客戶端期望的另一個接口的表示,主要目的是實現(xiàn)兼容性,讓原本因為接口不匹配,沒辦法一起工作的兩個類,可以協(xié)同工作。本文將通過示例詳細(xì)介紹適配器模式,需要的可以參考一下2022-09-09在IntelliJ IDEA中創(chuàng)建和運行java/scala/spark程序的方法
這篇文章主要介紹了在IntelliJ IDEA中創(chuàng)建和運行java/scala/spark程序的教程,本文通過實例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-05-05IDEA2020 1.1中Plugins加載不出來的問題及解決方法
這篇文章主要介紹了IDEA2020 1.1中Plugins加載不出來的問題,本文還給大家提到了IDEA 2020.1.1 找不到程序包和符號的問題,感興趣的朋友跟隨小編一起看看吧2020-06-06