Spring Boot中Autowired非自定义类出现No beans警告的解决方法
解决Spring Boot里Autowired非自定义类时IDEA报"No beans found"警告的问题
问题情况
- 使用IDE:IntelliJ IDEA 2022.3.1
- Spring Boot版本:2.7.4
- 弹出的警告:
Could not autowire. No beans of 'AuthenticationEntryPoint' type found.
涉及的代码片段:
安全配置类
@Configuration @EnableWebSecurity public class SecurityConfig { @Autowired private AuthenticationEntryPoint authEntryPoint; @Bean public SecurityFilterChain configure(HttpSecurity http) throws Exception { // ...你的业务代码 return http.build(); } }
自定义的组件扫描配置类
@Configuration @ComponentScan(basePackages = {"com.example.security"}) public class SecurityConfiguration {}
spring.factories里的配置
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\ com.example.SecurityConfiguration
问题:自己写的类用Autowired完全没问题,但像AuthenticationEntryPoint这种不是自己创建的类,一Autowired就出上面的警告。
解决办法
1. 先确认非自定义类的Bean有没有被Spring接管
像AuthenticationEntryPoint这种Spring Security提供的接口,得有对应的实现类被注册成Bean才能Autowired:
- 如果是你自己写的实现类,要确保类上加了
@Component或者@Service这类注解,而且所在的包能被组件扫描到; - 如果想用Spring Security自带的实现,得自己在配置类里手动声明成Bean,比如:
@Bean public AuthenticationEntryPoint authenticationEntryPoint() { return new HttpStatusEntryPoint(HttpStatus.UNAUTHORIZED); }
2. 调整组件扫描的范围
你现在的SecurityConfiguration只扫描com.example.security包,而Spring Boot自动配置的那些Bean(比如Spring Security的默认Bean)是通过自动配置类注册的,IDEA可能因为扫描范围太窄,识别不到这些自动配置的Bean:
- 要么删掉自定义的
SecurityConfiguration,直接在项目启动类上加@ComponentScan(basePackages = {"com.example"}),把扫描范围扩大到整个项目根包; - 要么别只靠自定义的组件扫描,让Spring Boot的自动配置正常生效——毕竟自动配置的Bean本来就不是靠你自己的组件扫描发现的。
3. 改IDEA的Autowired检查规则
如果运行的时候代码完全没问题,只是IDE瞎报警告,可以调低这个检查的严格程度:
- 打开IDEA的设置:
File > Settings > Editor > Inspections > Spring > Spring Core > Code > Autowiring for Bean Class - 把检查级别从
Error改成Warning或者Weak Warning,嫌麻烦也可以直接禁用这个检查(不推荐,除非确定是误报)。
4. 让Spring Boot自动配置正常生效
先检查spring.factories里的配置路径对不对,有没有拼写错误。另外Spring Boot 2.7+更推荐用@AutoConfiguration注解代替spring.factories注册自动配置类,你可以把SecurityConfiguration改成这样:
@AutoConfiguration @ComponentScan(basePackages = {"com.example.security"}) public class SecurityConfiguration {}
然后删掉spring.factories里对应的配置,这样Spring Boot能自动识别这个自动配置类,IDEA也能更好地识别到Bean的存在。
内容的提问来源于stack exchange,提问作者kernel
相关产品推荐
相关产品推荐

