Spring Boot JWT场景下@Autowired注入AuthenticationManager失败问题
问题根因
- 包名不匹配导致配置类未被扫描加载:你项目中安全配置类
MySecurityConfigurations、JWT工具类、鉴权入口类的包前缀为com.expensesd.demo(expenses后多了一个d),而控制器、用户服务类的包前缀为com.expenses.demo。Spring Boot默认仅扫描启动类所在包及其子包下的组件,若你的启动类在com.expenses.demo路径下,将无法识别com.expensesd.demo下的配置类,你声明的AuthenticationManagerBean自然不会被Spring容器创建。 - 错误配置
@Bean注解:你在MySecurityConfigurations类的configure(AuthenticationManagerBuilder auth)重写方法上错误添加了@Bean注解,该方法的作用是配置认证规则,无需声明为Bean,加注解会干扰Spring Security的初始化流程,导致AuthenticationManager无法正常实例化。
解决方案
按以下步骤修改即可解决注入失败问题:
- 统一项目包名:将
com.expensesd.demo.config包路径修改为com.expenses.demo.config,保证所有组件都在启动类的扫描范围内;也可在启动类上添加@ComponentScan(basePackages = {"com.expenses.demo","com.expensesd.demo"})临时兼容,但更推荐统一包名避免后续出现其他扫描问题。 - 移除错误的
@Bean注解:删除MySecurityConfigurations类中configure(AuthenticationManagerBuilder auth)方法上的@Bean注解,修改后代码如下:
@Override protected void configure(AuthenticationManagerBuilder auth) throws Exception { auth.userDetailsService(this.userDetailServiceImplementation).passwordEncoder(passwordEncoder()); }
- 检查启动类注解:确认启动类上没有排除Security自动配置的配置,如果存在
@SpringBootApplication(exclude = {SecurityAutoConfiguration.class})这类注解,请删除。
修改完成后重启项目即可正常注入AuthenticationManager。
内容的提问来源于stack exchange,提问作者Dante1501
相关产品推荐
相关产品推荐

