You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.16 16:45:37