You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

添加Spring Security依赖后出现NoSuchMethodError运行时错误求助

解决Spring Security引入时的NoSuchMethodError问题

这明显是Spring版本依赖冲突引发的问题,我帮你拆解原因和解决步骤:

问题根源

你在pom.xml中指定了Spring核心版本为5.0.4.RELEASE,但引入Spring Security(比如spring-security-core)时,它默认依赖了5.0.5.RELEASE版本的Spring组件。这就导致项目运行时,类路径中同时存在不同版本的Spring核心类——AnnotationUtils.clearCache()方法是Spring 5.0.5新增的,而实际加载的是5.0.4版本的AnnotationUtils,自然找不到这个方法,触发NoSuchMethodError

解决方案

1. 统一Spring版本管理

在pom.xml中通过<properties>统一声明Spring版本,让所有Spring相关依赖都继承这个版本,从根源避免版本不一致:

<properties>
    <spring.version>5.0.4.RELEASE</spring.version>
</properties>

之后所有Spring和Spring Security的依赖都不要单独指定版本,或者用${spring.version}引用这个变量,比如:

<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-context</artifactId>
    <version>${spring.version}</version>
</dependency>
<dependency>
    <groupId>org.springframework.security</groupId>
    <artifactId>spring-security-web</artifactId>
    <version>${spring.version}</version>
</dependency>

2. 强制覆盖冲突依赖版本

如果上面的方式没生效,可通过<dependencyManagement>显式指定Spring核心组件的版本,强制Maven优先使用你指定的版本:

<dependencyManagement>
    <dependencies>
        <!-- 强制所有Spring核心组件使用5.0.4.RELEASE -->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-core</artifactId>
            <version>${spring.version}</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context</artifactId>
            <version>${spring.version}</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-web</artifactId>
            <version>${spring.version}</version>
        </dependency>
        <!-- 其他用到的Spring核心组件都可以在这里统一声明 -->
    </dependencies>
</dependencyManagement>

3. 排除特定依赖的冲突组件

如果执行mvn dependency:tree后,发现仍有spring-security-core引入的5.0.5版本Spring组件,可以在spring-security-core的依赖中添加排除规则:

<dependency>
    <groupId>org.springframework.security</groupId>
    <artifactId>spring-security-core</artifactId>
    <version>你的Spring Security版本</version>
    <exclusions>
        <exclusion>
            <groupId>org.springframework</groupId>
            <artifactId>spring-core</artifactId>
        </exclusion>
        <exclusion>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context</artifactId>
        </exclusion>
        <!-- 排除其他冲突的Spring组件 -->
    </exclusions>
</dependency>

4. 验证依赖一致性

修改后再次执行mvn dependency:tree,检查所有Spring组件的版本是否统一为5.0.4.RELEASE,确保没有混合版本的情况。

额外建议

Spring Security和Spring核心版本存在严格的兼容性对应关系,建议尽量使用匹配的版本组合(比如Spring 5.0.x对应Spring Security 5.0.x),避免跨版本混用引发其他潜在问题。

内容的提问来源于stack exchange,提问作者Kingamere

火山引擎 最新活动