Spring升级后出现NoSuchMethodError:ReflectionUtils.accessibleConstructor方法缺失
问题背景
- 环境:Wildfly 23.0.2,Java从7升级至17,Spring Framework从4.3.24升级到5.3.22,Hibernate从3.6升级到5.6
- 现象:两个依赖逻辑相似的应用,一个启动立即报错,另一个运行正常;移除
SecurityWebInitializer的继承关系后,报错消失
报错信息
14:20:38,360 ERROR [org.jboss.msc.service.fail] (ServerService Thread Pool -- 182) MSC000001: Failed to start service jboss.deployment.unit."myapp.war".undertow-deployment: org.jboss.msc.service.StartException in service jboss.deployment.unit."myapp.war".undertow-deployment: java.lang.RuntimeException: javax.servlet.ServletException: Failed to instantiate WebApplicationInitializer class at org.wildfly.extension.undertow@23.0.2.Final//org.wildfly.extension.undertow.deployment.UndertowDeploymentService$1.run(UndertowDeploymentService.java:81) ...(省略部分栈信息) Caused by: java.lang.NoSuchMethodError: 'java.lang.reflect.Constructor org.springframework.util.ReflectionUtils.accessibleConstructor(java.lang.Class, java.lang.Class[])' at deployment.myapp.war//org.springframework.web.SpringServletContainerInitializer.onStartup(SpringServletContainerInitializer.java:157) ... 20 more
关联代码
package com.myapp.security.web.config; import org.springframework.context.annotation.Profile; import org.springframework.security.web.context.AbstractSecurityWebApplicationInitializer; @Profile("keycloak-auth") public class SecurityWebInitializer extends AbstractSecurityWebApplicationInitializer { protected Class<?>[] getRootConfigClasses() { return new Class[] {SecurityConfig.class}; } }
已完成排查
- 确认WEB-INF/lib下存在
spring-core-5.3.22.jar,无Spring包多版本冲突 - 检查Wildfly modules目录,无旧版Spring Core
- 清理Maven仓库中的Spring Framework包
解决思路
1. 校验Spring Security与Spring Framework版本兼容性
- 查看项目中Spring Security的版本,确保其与Spring Framework 5.3.22完全兼容(Spring Security 5.3系列适配Spring 5.3系列,若混用不同大版本会引发类方法不匹配问题)
- 执行
mvn dependency:tree输出完整依赖树,排查Spring Security的传递依赖是否引入低版本Spring Core/Context等包
2. 排查Wildfly类加载顺序冲突
- 检查Wildfly的第三方模块(如Keycloak相关模块)是否引入了旧版Spring类
- 查看Wildfly的
standalone.xml/domain.xml,确认是否有全局模块配置强制加载了Spring相关包 - 给应用添加
jboss-deployment-structure.xml,强制应用优先加载自身WEB-INF/lib下的类,避免容器类加载干扰:<jboss-deployment-structure> <deployment> <exclusions> <module name="org.springframework" /> <module name="org.springframework.security" /> </exclusions> <local-last value="false" /> </deployment> </jboss-deployment-structure>
3. 检查@Profile注解的生效时机
AbstractSecurityWebApplicationInitializer在Servlet容器启动阶段被加载,而@Profile默认在Spring上下文初始化时才生效,可能导致容器尝试实例化该类(即使当前Profile不是keycloak-auth):
- 将
@Profile注解迁移到SecurityConfig类上,而非SecurityWebInitializer - 检查Wildfly启动时是否激活了
keycloak-authProfile,或是否存在Profile配置冲突
4. 验证Spring核心类的完整性
- 解压WEB-INF/lib下的
spring-core-5.3.22.jar,确认org.springframework.util.ReflectionUtils类中存在accessibleConstructor(Class, Class[])方法(Spring 4.x中该方法为可变参数形式accessibleConstructor(Class...)) - 再次检查WAR包的WEB-INF/lib目录,确保没有混入Spring 4.x的任何包
5. 确认Servlet容器与Spring的兼容性
Wildfly 23.0.2对应Servlet 4.0,Spring 5.3.22支持该版本:
- 检查项目中Servlet API依赖版本,确保与Wildfly提供的Servlet 4.0兼容(避免引入过高/过低版本的Servlet API包)
- 确认
spring-web包版本为5.3.22(SpringServletContainerInitializer属于spring-web,需单独校验)
内容的提问来源于stack exchange,提问作者d00d
相关产品推荐
相关产品推荐

