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

JSTL forEach 標籤熱部署報 NoSuchFieldError: deferredExpression 解決方案

     編輯:Java 程式設計入門

修改 JSP 後熱刷新拋出長堆疊異常,核心提示:

java.lang.NoSuchFieldError: deferredExpression
    at org.apache.taglibs.standard.tag.common.core.ForEachSupport.release(ForEachSupport.java:178)
    at org.apache.jasper.runtime.TagHandlerPool.release(TagHandlerPool.java:166)
    ...

根因

WEB-INF/lib 下存在多個版本的 JSTL 實現 JAR(如 jstl-1.2.jar、standard-1.1.2.jar、javax.servlet.jsp.jstl-api-1.2.1.jar 同時存在),導致類加載器加載到不兼容的 ForEachSupport 類,字段 deferredExpression 缺失。

快速修復

  1. 檢查 WEB-INF/lib,刪除多餘/舊版 JSTL JAR,僅保留一套匹配的 API + 實現:
    • Servlet 2.5 / JSP 2.1 容器(Tomcat 6/7):jstl-1.2.jar(含 API 與實現)
    • Servlet 3.0+ 容器(Tomcat 8+):javax.servlet.jsp.jstl-api-1.2.1.jar + javax.servlet.jsp.jstl-1.2.1.jar
  2. 清理項目:mvn clean / Eclipse Project → Clean。
  3. 重啟應用服務器。

依賴管理最佳實踐

<!-- Maven 統一依賴,避免傳遞衝突 -->
<dependency>
  <groupId>javax.servlet</groupId>
  <artifactId>jstl</artifactId>
  <version>1.2</version>
</dependency>
<!-- 若容器已提供 API,標記 provided -->
<dependency>
  <groupId>javax.servlet.jsp.jstl</groupId>
  <artifactId>javax.servlet.jsp.jstl-api</artifactId>
  <version>1.2.1</version>
  <scope>provided</scope>
</dependency>

驗證

重新部署後,JSP 熱刷新正常,<c:forEach> 迭代無異常。

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