Spring Boot 跨类调用时@Autowired 注入为null的问题求助
故障核心原因
你在SomeRestClass中手动通过new Check()创建的实例,完全不受Spring容器管控。
Spring的@Autowired自动装配逻辑,只会对容器托管的Bean生效;手动new出来的对象走不到Spring的字段注入流程,因此Check类里的sfr字段没有被赋值,才会出现null。
为何直接调用REST接口时功能正常?
当你直接访问http://localhost:8080/api/checker时,Spring MVC会从容器中取出已经完成初始化、自动装配的托管版Check Bean来处理请求,这个Bean内部的sfr早已被注入完成,因此运行没有问题。
正确的代码改造方案
不需要手动实例化Check,直接将Check作为依赖注入到SomeRestClass即可:
@RestController public class SomeRestClass{ // 直接注入Spring托管的Check实例,删除手动new的逻辑 @Autowired Check c; public void letsSave(){ c.checkSettlementFinance("99999"); } }
常见踩坑提醒
- 所有需要使用Spring注解(包括
@Autowired、@Transactional等依赖容器能力的注解)的类,必须由Spring容器托管,不能手动new对象 - 只要遇到注入字段为null的问题,第一时间排查当前使用的实例是不是手动new出来的、没有被Spring扫描托管的对象
内容的提问来源于stack exchange,提问作者Saravana Jagan
相关产品推荐
相关产品推荐

