升级CXF与Spring后出现NoSuchFieldError:REFLECTION问题求助
排查思路
1. 定位REFLECTION字段的归属类
反编译jaxws-rt-2.1.4.jar中的com.sun.xml.ws.model.RuntimeModeler类,找到第729行调用的REFLECTION字段所属的全限定类名。该字段大概率属于JAXB相关核心类(如com.sun.xml.bind.api.JAXBRIContext或javax.xml.bind.JAXBContext),明确归属后才能针对性排查版本匹配问题。
2. 解决jaxws-rt与CXF的依赖冲突
jaxws-rt-2.1.4是老旧版本,而CXF 3.5.x自身已集成jaxws相关实现,两者共存会导致类版本冲突:
- 用依赖分析命令排查依赖树:Maven执行
mvn dependency:tree,Gradle执行gradle dependencies,找出所有jaxws相关依赖(如jaxws-rt、jaxws-api)的版本和来源。 - 移除项目中显式引入的
jaxws-rt-2.1.4.jar,改用CXF自带的jaxws实现,避免旧版本组件干扰。
3. 统一JAXB版本与依赖匹配
jaxws-rt-2.1.4仅兼容JAXB 2.1.x系列,当前使用的JAXB 2.2.11与其不匹配:
- 若保留jaxws-rt-2.1.4,需将所有JAXB依赖(jaxb-core、jaxb-impl、jaxb-api)降级至2.1.x版本,同时验证是否与CXF 3.5.x、Spring 5.3.27兼容。
- 若优先适配CXF 3.5.x,需彻底移除旧jaxws组件,统一使用CXF提供的JAXB相关依赖,确保版本链一致。
4. 排查类加载器导致的版本冲突
NoSuchFieldError可能由类加载器加载了不同版本的类导致:
- 打印目标类的加载来源,确认实际生效的jar包:
Class<?> targetClass = Class.forName("REFLECTION字段所属的类全名"); System.out.println(targetClass.getProtectionDomain().getCodeSource().getLocation());
- 检查应用服务器(如Tomcat)的全局lib目录,若存在冲突的jaxb/jaxws包,需移除或调整类加载优先级,确保项目本地依赖优先加载。
5. 验证Adobe Forms Service客户端兼容性
错误触发于Adobe Forms Service的客户端调用,需确认客户端代码与当前框架版本的兼容性:
- 使用CXF 3.5.x提供的
wsdl2java工具重新生成Forms Service的客户端代码,替换旧代码,确保客户端与CXF版本匹配。 - 查阅Adobe官方文档,确认Forms Service支持的jaxws/JAXB版本范围,验证其与Spring 5.3.27、CXF 3.5.x的兼容性。
内容的提问来源于stack exchange,提问作者Rajan
相关产品推荐
相关产品推荐

