Spring Boot集成Swagger UI时出现NoSuchMethodError异常求助
Spring Boot集成Swagger UI时出现NoSuchMethodError异常求助
嘿,我看你在Spring Boot 3.4.5里整合springdoc-openapi-starter-webmvc-ui:2.3.0时碰到了NoSuchMethodError,这种坑我之前帮不少开发者踩过,大多是依赖版本不兼容或者冲突搞的鬼,咱们一步步来捋清楚。
先把你没写完的安全配置补全一个常见的场景,方便后续分析:
@Bean SecurityFilterChain filterChain(HttpSecurity http) throws Exception { http.cors(Customizer.withDefaults()).csrf(AbstractHttpConfigurer::disable) .exceptionHandling((exceptionHandling) -> exceptionHandling.authenticationEntryPoint(authenticationEntryPoint)) .authorizeHttpRequests(auth -> auth .requestMatchers("/v3/api-docs/**", "/swagger-ui/**", "/swagger-ui.html").permitAll() .anyRequest().authenticated()) .sessionManagement(session -> session.sessionCreationPolicy(SessionCreationPolicy.STATELESS)); return http.build(); }
为什么会出现NoSuchMethodError?
这个异常本质是JVM加载类时找不到预期的方法,常见原因有这几个:
- 版本适配问题:Spring Boot 3.x对springdoc-openapi的版本有严格要求,你用的2.3.0可能和Spring Boot 3.4.5的底层API不匹配——比如Spring框架的某些方法在3.4.5里有变更,而springdoc 2.3.0还在调用旧的方法。
- 依赖冲突:你的项目可能间接引入了其他版本的springdoc相关依赖(比如springdoc-openapi-core的旧版本),导致类加载时拿到了错误版本的类,自然找不到对应的方法。
- 编译缓存搞鬼:旧的编译产物没清理干净,导致新依赖的类没被正确加载,还是用了旧的类文件。
具体解决步骤
调整springdoc版本到适配范围
Spring Boot 3.4.x建议使用springdoc-openapi-starter-webmvc-ui 2.5.0及以上版本,你可以修改项目的依赖配置:- 如果是Maven项目,修改pom.xml:
<dependency> <groupId>org.springdoc</groupId> <artifactId>springdoc-openapi-starter-webmvc-ui</artifactId> <version>2.5.0</version> </dependency> - 如果是Gradle项目,修改build.gradle:
implementation 'org.springdoc:springdoc-openapi-starter-webmvc-ui:2.5.0'
- 如果是Maven项目,修改pom.xml:
排查并解决依赖冲突
用依赖分析命令查看项目的依赖树:- Maven执行:
mvn dependency:tree - Gradle执行:
gradle dependencies
找一找有没有多个版本的springdoc-openapi相关依赖(比如springdoc-openapi-core、springdoc-openapi-starter-common等),如果有,就在冲突的依赖里加上排除配置,比如:
<dependency> <groupId>某个第三方依赖的groupId</groupId> <artifactId>某个第三方依赖的artifactId</artifactId> <exclusions> <exclusion> <groupId>org.springdoc</groupId> <artifactId>springdoc-openapi-core</artifactId> </exclusion> </exclusions> </dependency>- Maven执行:
清理缓存重新构建
有时候旧的编译缓存会捣乱,按这个步骤来:- 执行清理命令:Maven用
mvn clean,Gradle用gradle clean - 删掉本地仓库里的springdoc相关缓存(比如Maven的
~/.m2/repository/org/springdoc目录下的所有内容) - 重新构建项目:Maven用
mvn install,Gradle用gradle build
- 执行清理命令:Maven用
检查安全配置中的方法调用
确认你在SecurityFilterChain里调用的方法,比如requestMatchers、authenticationEntryPoint相关的方法,在当前Spring Boot和springdoc版本中都是存在的,没有被废弃或移除。如果有调用过时的方法,及时替换成新版本的API。
内容来源于stack exchange
相关产品推荐
相关产品推荐

