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

Spring Boot应用部署失败 报无法解析的Bean循环引用错误

问题根因

一开始判断Repository实例为null属于排查方向错了,这个报错和Repository空指针没有关系,核心是Spring启动时出现了无法自动解决的循环依赖,异常栈里明确标注了Is there an unresolvable circular reference?,问题根源出在安全配置类的写法上。
当前的依赖死锁逻辑非常清晰:

  • Spring创建WebSecurityConfig这个配置类Bean时,会先处理所有标了@Autowired的属性和方法,也就是需要先注入UserDetailsService实例、执行configureGlobal初始化方法
  • 创建UserDetailsService对应的实现类、以及异常栈里提到的userAuthentificationServiceImpl时,需要注入BCryptPasswordEncoder类型的Bean
  • 但BCryptPasswordEncoder的Bean原本定义在还没完成初始化的WebSecurityConfig里,Spring拿不到可用的完整实例,两边互相等待对方初始化完成,直接卡死抛出异常。
    另外你在configureGlobal方法里直接调用同类下的bCryptPasswordEncoder()方法获取编码器实例,相当于配置类自身还没初始化完成,就提前尝试获取它内部定义的Bean,这也是直接触发BeanCurrentlyInCreationException的直接诱因。
修复步骤

按下面的要求修改完代码,应用就能正常启动:

  • 把BCryptPasswordEncoder的Bean定义单独挪到一个独立的配置类中,不要和Web安全配置放在同一个类里,从根源上切断循环依赖的链路:
@Configuration
public class PasswordEncoderConfig {
    @Bean
    public BCryptPasswordEncoder bCryptPasswordEncoder() {
        return new BCryptPasswordEncoder();
    }
}
  • 删掉WebSecurityConfig里原本写的bCryptPasswordEncoder()方法,修改configureGlobal方法的写法,不要手动调用类内方法获取编码器,改为通过方法参数声明依赖,让Spring自动从容器中注入已经初始化完成的实例:
@Autowired
public void configureGlobal(AuthenticationManagerBuilder auth, BCryptPasswordEncoder bCryptPasswordEncoder) throws Exception {
    auth.userDetailsService(userDetailsService).passwordEncoder(bCryptPasswordEncoder);
}
  • 检查异常栈里提到的userAuthentificationServiceImpl类(你贴代码时没有附上这个类的内容),确认它注入BCryptPasswordEncoder时使用@Autowired做自动注入,不要手动new实例,也不要通过直接调用配置类方法的方式获取Spring管理的Bean。
补充说明

你贴出的Repository层代码、UserAuthentificationDetailsServiceImpl实现类的代码本身没有注入问题,之前查到的“手动实例化Service导致Repository为null”的常见错误在这部分代码里不存在,不需要在这两块内容上浪费时间排查。
你提到的安全配置类长导入语句换行的问题属于排版显示问题,不会影响代码实际运行,不需要额外处理。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 11:03:25