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

Spring Security测试出现StackOverflowError问题求助

Spring Security迁移后@WebMvcTest栈溢出问题修复

问题根源

用SecurityFilterChain替代WebSecurityConfigurerAdapter后,@WebMvcTest测试环境下,自定义的AuthenticationManager Bean和Security自动配置的Bean产生了代理冲突或循环依赖,导致栈溢出和代理解包失败。

修复步骤

1. 正确暴露AuthenticationManager Bean

别用旧的authenticationManagerBean()重写方式,改用Spring Security 5.7+推荐的标准写法,从AuthenticationConfiguration获取:

@Bean
public AuthenticationManager authenticationManager(AuthenticationConfiguration authConfig) throws Exception {
    return authConfig.getAuthenticationManager();
}

这种方式避免了旧逻辑带来的代理对象冲突,同时保证主应用能正常注入AuthenticationManager。

2. 调整@WebMvcTest的配置

在测试类里添加@AutoConfigureMockMvc(addFilters = false),跳过Security过滤器的自动配置,减少测试环境的Bean冲突:

@WebMvcTest(HelloController.class)
@AutoConfigureMockMvc(addFilters = false)
public class HelloControllerTest {
    // 测试代码
}

如果测试需要验证Security逻辑,建议改用@SpringBootTest搭配@AutoConfigureMockMvc,因为@WebMvcTest只加载Web层Bean,容易和全局Security配置产生冲突。

3. 检查SecurityFilterChain配置

确保你的SecurityFilterChain没有多余的Bean引用,避免循环依赖:

@Bean
public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
    http
        .authorizeHttpRequests(auth -> auth.anyRequest().authenticated())
        .formLogin().permitAll()
        .logout().permitAll();
    return http.build();
}

验证

修改后重新运行测试类,栈溢出和Failed to unwrap proxied object错误应该会消失,主应用的AuthenticationManager注入也能正常工作。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 07:50:29