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
相关产品推荐
相关产品推荐

