首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

Struts2 JSON 序列化懶加載異常解決方案:黑名單過濾與 Jar 包衝突排查

     編輯:Java 相關知識

在 Struts2 專案中使用 JSON 插件序列化 Hibernate 實體時,常遇到懶加載異常(LazyInitializationException)或代理類轉換異常(ClassCastException: ... cannot be cast to javassist.util.proxy.Proxy)。本文深度剖析兩類異常根因,提供黑名單過濾與Jar 包去重雙重解決方案。

一、場景還原

  • 實體關係:Admin (1) → (N) Category (1) → (N) Product
  • 關聯映射:@ManyToOne(fetch = FetchType.LAZY)
  • 查詢 HQL:from Product p left join fetch p.category where p.name like :name
  • 結果:Product 與 Category 已初始化,但 Category 內的 Admin 為未初始化代理對象
  • JSON 序列化時嘗試訪問 Admin 觸發異常(Session 已關閉)

二、方案一:Struts2 JSON 黑名單過濾(推薦)

在 struts.xml 中配置 excludeProperties 使用正則表達式排除懶加載屬性:

<package name="default" namespace="/" extends="json-default">
    <action name="product*" class="com.action.ProductAction" method="{1}">
        <result type="json">
            <param name="excludeProperties">
                category\.admin.*  # 過濾 Category 下的 admin 屬性及其子屬性
            </param>
            <param name="includeProperties">
                id,name,price,category\.id,category\.name  # 顯式包含需要的屬性
            </param>
        </result>
    </action>
</package>
  • 優點:不修改實體類、不改變獲取策略、靈活控制輸出字段
  • 注意:需繼承 json-default 包,使用 json 結果類型

三、方案二:Jar 包衝突排查(根因修復)

若配置黑名單後異常依然存在,檢查類路徑下 javassist 版本衝突:

  • Struts2 依賴 javassist-3.11.0.GA.jar
  • Hibernate 依賴 javassist-3.x.x.GA.jar(版本可能不同)
  • 類加載器載入較舊版本導致代理類不兼容,拋出 ClassCastException

排查步驟

  1. Maven 專案執行 mvn dependency:tree | grep javassist
  2. IDE 查看 External Libraries 中是否存在多個 javassist jar
  3. 排除傳遞依賴:在 pom.xml 中排除 struts2 帶入的 javassist
<dependency>
    <groupId>org.apache.struts</groupId>
    <artifactId>struts2-core</artifactId>
    <version>2.5.x</version>
    <exclusions>
        <exclusion>
            <groupId>org.javassist</groupId>
            <artifactId>javassist</artifactId>
        </exclusion>
    </exclusions>
</dependency>
  • 統一使用 Hibernate 帶入的版本(或顯式聲明較新版本)
  • 清理專案、重新編譯部署,異常消失
  • 四、對比總結

    方案適用場景優點缺點
    黑名單過濾僅需控制 JSON 輸出字段,實體映射保持 LAZY非侵入式、靈活、不影響其他業務若有多處序列化需維護多份配置
    改為 EAGER關聯數據量小、必須同時加載簡單直接性能差、N+1 問題、違背領域模型設計
    Jar 包去重出現 ClassCastException、代理類異常根治底層衝突、修復所有潛在問題需仔細排查依賴樹

    五、最佳實踐建議

    1. 首選黑名單:Struts2 JSON 配置 excludeProperties 精準控制輸出
    2. 定期檢查依賴:mvn dependency:analyze 發現衝突
    3. 統一序列化策略:考慮引入 Jackson + 自定義序列化視圖,替換 Struts2 內建 JSON 插件
    4. Open Session In View:配合 Spring OpenSessionInViewFilter 延長 Session 生命週期(需權衡事務邊界)

    六、總結

    Struts2 JSON 懶加載異常本質是序列化觸發未初始化代理。黑名單過濾是業務層面的精準手術刀;Jar 包衝突是技術層面的隱形殺手。兩者結合:先配黑名單解決業務,再查依賴鞏固基石,才能徹底擺脫「序列化噩夢」。

    1. 上一篇文章:
    2. 下一篇文章:
    Copyright © 程式碼之家 All Rights Reserved