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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 07:28:15