Spring MockMVC FilterChainProxy.getFilters()空指针异常排查求助
解决MockMVC测试OAuth资源服务器端点时的FilterChainProxy配置问题
嘿,我看你在测试OAuth资源服务器端点时,在FilterChainProxy的配置上踩坑了。先说说你当前代码里的核心问题:直接把FilterChainProxy.class放进@ContextConfiguration是行不通的——这个过滤器链需要完整的Spring Security配置支撑(比如资源服务器规则、JWT解析器这些核心组件),单独加载它根本没法初始化出可用的安全校验链。另外,MockMVC的构建方式也需要调整,才能让请求正确经过安全校验流程。
给你两个可行的解决方案,按需选择:
方案一:传统Spring测试配置(JUnit 4)
调整测试类的配置,加载完整的安全配置和控制器,然后正确构建MockMVC:
@RunWith(SpringJUnit4ClassRunner.class) // 替换成你的Spring Security配置类和控制器所在的配置类 @ContextConfiguration(classes = {SecurityConfig.class, ItemController.class}) public class ItemCTest { @Autowired private ItemController itemController; @Autowired private FilterChainProxy springSecurityFilterChain; private MockMvc mockMvc; @Before public void setup() { // 把控制器和安全过滤器链整合到MockMvc中,让请求先过安全校验 mockMvc = MockMvcBuilders.standaloneSetup(itemController) .addFilter(springSecurityFilterChain) .build(); } // 示例测试方法:模拟带合法Bearer Token的请求 @Test public void testGetItems() throws Exception { mockMvc.perform(get("/items") .header(HttpHeaders.AUTHORIZATION, "Bearer " + generateMockValidJwt())) .andExpect(status().isOk()); } // 生成符合你资源服务器配置的模拟JWT Token private String generateMockValidJwt() { return Jwts.builder() .setSubject("test-user-123") // 这里要匹配你Security配置里要求的权限/scope .claim("scope", "read:items") .signWith(SignatureAlgorithm.HS256, "your-jwt-secret-key") // 替换成你的实际密钥 .compact(); } }
关键要点:
- @ContextConfiguration:必须加载完整的Spring Security配置类(比如
SecurityConfig,里面定义了@EnableResourceServer、JWT解码器等规则),不能只加载FilterChainProxy。 - MockMvc构建:通过
addFilter把安全过滤器链加入请求流程,确保请求先经过Spring Security的认证授权,再到达控制器。 - 模拟认证:资源服务器要求Bearer Token,所以需要生成符合规则的JWT,保证Security能正确解析并通过授权校验。
方案二:Spring Boot简化配置(更推荐)
如果你的项目是Spring Boot,用@SpringBootTest结合@AutoConfigureMockMvc会更省心,还能用上Spring Security Test提供的便捷工具:
@SpringBootTest @AutoConfigureMockMvc public class ItemCTest { @Autowired private MockMvc mockMvc; @Test public void testGetItems() throws Exception { // 用Spring Security Test的jwt()工具直接模拟认证,不用手动生成Token mockMvc.perform(get("/items") .with(jwt().jwt(token -> token .subject("test-user-123") .claim("scope", "read:items")))) .andExpect(status().isOk()); } }
这个方案不需要手动处理过滤器链,Spring会自动配置好MockMvc和安全环境,jwt()请求后置处理器能快速模拟合法的OAuth认证上下文,省去了手动生成Token的麻烦,非常高效。
内容的提问来源于stack exchange,提问作者Sam124
相关产品推荐
相关产品推荐

