Struts从2.3.7升级到2.3.33后出现JSONWriter方法缺失错误
我之前处理过类似的Struts2升级问题,这个java.lang.NoSuchMethodError: org.apache.struts2.json.JSONWriter.setDateFormatter(Ljava/lang/String;)V本质是类依赖版本冲突导致的——你的项目classpath中混入了旧版本的JSONWriter类(来自之前的Struts2 2.3.7),而新版本的struts2-json-plugin-2.3.33尝试调用该类中已变更或不存在的方法。下面是一步步的解决方法:
1. 统一所有Struts2相关依赖的版本
首先确保你的pom.xml中所有Struts2核心组件(包括JSON插件)都明确指定为2.3.33版本,绝对不能混合旧版本:
<!-- Struts2核心依赖 --> <dependency> <groupId>org.apache.struts</groupId> <artifactId>struts2-core</artifactId> <version>2.3.33</version> </dependency> <!-- JSON处理插件 --> <dependency> <groupId>org.apache.struts</groupId> <artifactId>struts2-json-plugin</artifactId> <version>2.3.33</version> </dependency> <!-- XWork核心依赖 --> <dependency> <groupId>org.apache.struts.xwork</groupId> <artifactId>xwork-core</artifactId> <version>2.3.33</version> </dependency>
2. 排查并排除依赖冲突
很多时候第三方依赖会偷偷引入旧版本的Struts2组件,你可以用Maven的依赖树命令找出这些冲突:
mvn dependency:tree
在输出结果中查找包含struts2-json-plugin、xwork-core的条目,如果发现有依赖引入了2.3.7或其他旧版本,就在对应的依赖中添加排除规则,把旧版本的组件踢出去:
<dependency> <groupId>第三方依赖的groupId</groupId> <artifactId>第三方依赖的artifactId</artifactId> <version>第三方依赖的版本号</version> <exclusions> <!-- 排除旧版本的Struts2 JSON插件 --> <exclusion> <groupId>org.apache.struts</groupId> <artifactId>struts2-json-plugin</artifactId> </exclusion> <!-- 排除旧版本的XWork核心 --> <exclusion> <groupId>org.apache.struts.xwork</groupId> <artifactId>xwork-core</artifactId> </exclusion> </exclusions> </dependency>
3. 清理缓存并重新构建
旧版本的jar包可能残留在Maven本地仓库或项目的target目录中,执行以下命令强制清理并重新构建项目:
# 清理项目构建目录 mvn clean # 强制更新依赖并重新安装 mvn install -U
4. 检查最终打包的依赖
最后确认项目打包后的WEB-INF/lib目录中,所有Struts2相关jar都是2.3.33版本,没有遗留2.3.7版本的文件。如果是IDE开发,也可以清理IDE的缓存(比如IntelliJ的File -> Invalidate Caches...,Eclipse的Project -> Clean...),避免IDE加载旧的class文件。
额外说明
Struts2 2.3.x系列后续版本对JSON处理的配置没有重大变更,你的Action注解和Ajax代码完全不需要修改,只要依赖版本统一就能正常运行。
内容的提问来源于stack exchange,提问作者assuna

