SpringBoot 2.0.2中BCryptPasswordEncoder Bean注入失败问题
我之前也踩过这个一模一样的坑!明明配置类里写了Bean定义,启动时却提示找不到,甚至换了DelegatingPasswordEncoder也不行。咱们一步步来排查解决:
1. 确认配置类是否被Spring识别
首先检查你的ApiWebSecurityConfig类是否添加了@Configuration注解——这是Spring识别配置类的核心标记,没加的话里面的@Bean定义根本不会被加载:
@Configuration // 必须加这个注解! public class ApiWebSecurityConfig { @Bean public BCryptPasswordEncoder passwordEncoder() { return new BCryptPasswordEncoder(); } }
2. 检查配置类的包扫描范围
Spring Boot默认只会扫描主启动类所在包及其子包下的组件。如果你的ApiWebSecurityConfig在主启动类的包外(比如主启动类在com.bonanza.backend,配置类在com.bonanza.config),那Spring会直接忽略它。解决办法二选一:
- 把配置类移到主启动类的同级或子包下
- 在主启动类上添加
@ComponentScan指定扫描路径:
@SpringBootApplication @ComponentScan(basePackages = {"com.bonanza.backend", "com.bonanza.config"}) public class YourApplication { public static void main(String[] args) { SpringApplication.run(YourApplication.class, args); } }
3. 确保UserService的注入类型与Bean匹配
如果你的UserService里是这样注入的:
@Service public class UserService { private BCryptPasswordEncoder passwordEncoder; @Autowired public UserService(BCryptPasswordEncoder passwordEncoder) { this.passwordEncoder = passwordEncoder; } }
那你配置的Bean必须是BCryptPasswordEncoder类型。如果换用了DelegatingPasswordEncoder,那UserService里的注入类型要改成PasswordEncoder接口(因为DelegatingPasswordEncoder是PasswordEncoder的实现类,但不是BCryptPasswordEncoder的子类):
// 配置类示例:DelegatingPasswordEncoder定义 @Configuration public class ApiWebSecurityConfig { @Bean public PasswordEncoder passwordEncoder() { String idForEncode = "bcrypt"; Map<String, PasswordEncoder> encoders = new HashMap<>(); encoders.put(idForEncode, new BCryptPasswordEncoder()); return new DelegatingPasswordEncoder(idForEncode, encoders); } } // UserService对应的注入方式 @Service public class UserService { private PasswordEncoder passwordEncoder; @Autowired public UserService(PasswordEncoder passwordEncoder) { this.passwordEncoder = passwordEncoder; } }
4. 排查是否存在多个PasswordEncoder Bean冲突
如果项目中其他配置类也定义了PasswordEncoder类型的Bean,Spring会不知道该注入哪一个,导致报错。这时候可以在你想要优先使用的Bean上添加@Primary注解:
@Configuration public class ApiWebSecurityConfig { @Bean @Primary // 指定这个Bean为优先选择 public BCryptPasswordEncoder passwordEncoder() { return new BCryptPasswordEncoder(); } }
5. 清理Eclipse缓存并重启
有时候Eclipse的编译缓存或Maven依赖缓存会搞事情,导致Spring上下文加载异常。试试这些操作:
- 点击菜单栏
Project -> Clean,清理项目编译缓存 - 右键项目选择
Maven -> Clean Install,重新构建项目 - 关闭并重启Eclipse,再启动应用
按照上面的步骤排查,应该就能解决Bean找不到的问题了!
内容的提问来源于stack exchange,提问作者Nunyet Calçada

