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

Struts2 啟動報 NoSuchFieldException: resourceEntries —— Tomcat 8 兼容性 Bug 修復

     編輯:Java 綜合教學

異常堆疊

java.lang.NoSuchFieldException: resourceEntries
 at java.lang.Class.getDeclaredField(Class.java:1901)
 at com.opensymphony.xwork2.util.LocalizedTextUtil.clearMap(LocalizedTextUtil.java:877)
 at com.opensymphony.xwork2.util.LocalizedTextUtil.clearTomcatCache(LocalizedTextUtil.java:857)
 ...

根因分析

Struts2 LocalizedTextUtil.clearTomcatCache() 嘗試通過反射訪問 Tomcat 類加載器的 resourceEntries 欄位以清理緩存。代碼邏輯:

Class cl = loader.getClass();
if ("org.apache.catalina.loader.WebappClassLoader".equals(cl.getName())) {
    clearMap(cl, loader, "resourceEntries"); // Tomcat 7 有此欄位
} else if ("org.apache.catalina.loader.WebappClassLoaderBase".equals(cl.getSuperclass().getName())) {
    clearMap(cl.getSuperclass(), loader, "resourceEntries"); // 嘗試父類
}

Tomcat 8 重構類加載器:WebappClassLoaderBase 中**移除了 resourceEntries 欄位**,導致反射拋出 NoSuchFieldException。

解決方案

  1. 降級 Tomcat 7:最快規避,但非長久之計。
  2. 升級 Struts2 版本:2.3.24+ / 2.5+ 已修復此兼容性問題(改用公開 API 或移除該緩存清理)。
  3. 自行打補丁:下載 Struts2 源碼,修改 LocalizedTextUtil 移除對 resourceEntries 的反射調用,重新編譯替換 JAR(利用開源優勢)。

驗證

Tomcat 7 WebappClassLoader 含 resourceEntries;Tomcat 8 WebappClassLoaderBase 無此欄位。升級框架為正解。

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