Spring Boot微服务JUnit控制器测试JWT依赖缺失问题求助
解决Spring Boot JWT控制器测试的NoClassDefFoundError问题
问题根源
你遇到的两类类加载失败错误,核心原因是依赖版本不兼容或缺少必要的测试依赖:
JwtGrantedAuthoritiesConverter属于spring-security-oauth2-resource-server模块,但如果依赖版本与Spring Boot主版本不匹配,会出现类缺失Jwt$Builder属于spring-security-oauth2-jwt模块,通常由spring-security-oauth2-resource-server间接引入,但版本冲突时会无法加载- 测试中使用的
jwt()方法来自spring-security-test模块,未添加该依赖也会导致相关扩展类无法找到
解决方案
1. 补充并统一核心依赖
在pom.xml中添加以下依赖,利用Spring Boot的依赖管理自动对齐版本,避免手动指定版本导致的冲突:
<!-- OAuth2资源服务核心依赖 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-oauth2-resource-server</artifactId> </dependency> <!-- Spring Security测试依赖,提供jwt() MockMvc扩展方法 --> <dependency> <groupId>org.springframework.security</groupId> <artifactId>spring-security-test</artifactId> <scope>test</scope> </dependency>
2. 排查并解决版本冲突
如果已添加依赖仍报错,执行mvn dependency:tree查看依赖树,检查是否有不同版本的spring-security-oauth2-jwt或spring-security-oauth2-resource-server被间接引入。若存在冲突,在dependencyManagement中强制指定统一版本:
<dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.security</groupId> <artifactId>spring-security-oauth2-jwt</artifactId> <version>${spring-security.version}</version> </dependency> <dependency> <groupId>org.springframework.security</groupId> <artifactId>spring-security-oauth2-resource-server</artifactId> <version>${spring-security.version}</version> </dependency> </dependencies> </dependencyManagement>
注意:${spring-security.version}必须与Spring Boot版本兼容,例如Spring Boot 2.7.x对应Spring Security 5.7.x,Spring Boot 3.x对应Spring Security 6.x。
3. 验证测试代码的正确导入
确保测试类中正确导入jwt()方法:
import static org.springframework.security.test.web.servlet.request.SecurityMockMvcRequestPostProcessors.jwt;
4. 清理缓存并重新构建
执行以下命令清理Maven缓存,重新加载依赖并构建项目:
mvn clean install -U
修正后的测试代码示例
@Test public void test_WhenPlaceOrderWithWrongAccess_thenThrow403() throws Exception { OrderRequest orderRequest = getMockOrderRequest(); MvcResult mvcResult = mockMvc.perform(MockMvcRequestBuilders.post("/order/placeOrder") .with(jwt().authorities(new SimpleGrantedAuthority("ADMIN"))) .contentType(MediaType.APPLICATION_JSON_VALUE) .content(objectMapper.writeValueAsString(orderRequest))) .andExpect(MockMvcResultMatchers.status().isForbidden()) .andReturn(); }
内容的提问来源于stack exchange,提问作者Sercan Noyan Germiyanoğlu
相关产品推荐
相关产品推荐

