Spring Boot集成Spring Security抛出NoSuchMethodError异常排查
根因分析
- 该报错和你自定义的
UUIDAuthenticationFilter鉴权逻辑、Spring Security配置无直接关联,核心是WildFly服务器类加载机制导致的Jackson依赖版本冲突。 - Spring Boot 2.6.4官方管理的Jackson全家桶版本为2.13.x,报错中提到的
_createContentReference(Ljava/lang/Object;)Lcom/fasterxml/jackson/core/io/ContentReference;方法是Jackson 2.13版本在jackson-core模块中新增的方法,jackson-dataformat-xml2.13版本会调用该方法。 - WildFly作为Java EE应用服务器,自身
modules目录内置了固定版本的Jackson依赖(WildFly 25及更早版本内置Jackson版本多为2.12.x及更低),默认类加载优先级下,服务器内置模块的类会优先于应用WAR包中WEB-INF/lib下的类被加载。最终实际运行时加载了低版本的jackson-core、高版本的jackson-dataformat-xml,方法签名不匹配抛出NoSuchMethodError。 - 错误触发点落在
chain.doFilter(request, response)行,是因为该方法会把请求向后传递到Spring MVC的消息转换层,此时才会初始化XML序列化组件、加载XmlFactory类,和过滤器本身的代码逻辑无关。 - 你之前查到的旧方案不匹配,是因为多数旧方案针对的是Maven传递依赖导致的版本冲突,没有覆盖WildFly类加载优先级高于应用私有依赖的场景,单纯调整pom.xml中的依赖配置无法解决服务器内置模块的版本覆盖问题。
修复方案
方案1:通过WildFly部署配置排除内置Jackson依赖(推荐)
该方案不需要调整现有Spring Boot对齐的依赖版本,兼容性最好。
在项目src/main/webapp/WEB-INF/路径下新建jboss-deployment-structure.xml配置文件,显式告诉WildFly部署当前应用时不要加载内置的Jackson模块,优先使用应用WAR包内自带的Jackson版本:
<?xml version="1.0" encoding="UTF-8"?> <jboss-deployment-structure> <deployment> <exclusions> <!-- 排除所有WildFly内置的Jackson相关模块 --> <module name="com.fasterxml.jackson.core.jackson-core"/> <module name="com.fasterxml.jackson.core.jackson-databind"/> <module name="com.fasterxml.jackson.core.jackson-annotations"/> <module name="com.fasterxml.jackson.dataformat.jackson-dataformat-xml"/> <module name="com.fasterxml.jackson.datatype.jackson-datatype-jsr310"/> <module name="com.fasterxml.jackson.datatype.jackson-datatype-jdk8"/> </exclusions> </deployment> </jboss-deployment-structure>
配置完成后重新执行Maven打包,将新的WAR包部署到WildFly即可。
方案2:对齐Jackson版本到WildFly内置版本(备选,存在兼容性风险)
如果不想修改WildFly的类加载配置,可以在项目pom.xml中通过属性全局指定Jackson版本,和你使用的WildFly内置版本完全对齐。
注意:你需要先确认当前WildFly版本内置的Jackson具体版本,可进入WildFly安装目录下
modules/com/fasterxml/jackson/core/jackson-core/main路径,查看jar包文件名上的版本号。
<properties> <!-- 替换为实际查询到的WildFly内置Jackson版本 --> <jackson.version>2.12.6</jackson.version> </properties>
该方案需要额外验证Spring Boot 2.6.4和低版本Jackson的兼容性,可能会出现其他序列化相关的异常,非必要不推荐使用。
验证方式
部署完成后调用业务接口,不再抛出该NoSuchMethodError即为修复生效,也可以在应用启动时添加日志打印com.fasterxml.jackson.core.VersionUtil类的版本信息,确认实际加载的Jackson版本和预期一致。
内容的提问来源于stack exchange,提问作者Shrawan Kelwa
相关产品推荐
相关产品推荐

