Spring Boot JPA问题:Autowired注入的CrudRepository子类Repository为null
解决Service类中@Autowired注入JPA Repository实例为null的问题
以下是几个最常见的排查和解决方向:
确保Service类被Spring容器管理
必须在你的Service类上添加@Service(或@Component)注解,只有被Spring识别为组件的类,容器才会为其处理依赖注入。如果没加这个注解,Spring根本不会管控这个类,里面的@Autowired自然不会生效。确认Repository接口被Spring Data JPA扫描到
你的Repository接口(继承CrudRepository的那个)要在Spring的扫描范围内:- 主启动类的
@SpringBootApplication默认扫描自身所在包及其子包,如果Repository在其他包,要在主启动类上添加@EnableJpaRepositories(basePackages = "你的Repository所在包路径")指定扫描路径; - 另外,Repository接口可以加上
@Repository注解(虽然Spring Data JPA会自动代理实现,但加上能更明确标识组件类型)。
- 主启动类的
禁止手动new Service实例
很多人踩坑是因为自己手动创建Service对象,比如UserService service = new UserService();。这种手动实例化的对象不在Spring容器管控范围内,Spring不会为它注入任何依赖,所以里面的Repository必然是null。必须通过Spring容器获取Service实例,比如在需要用Service的地方用@Autowired注入,或者通过ApplicationContext.getBean()获取。检查组件扫描范围是否覆盖Service和Repository
如果Service或Repository不在主启动类的子包下,要在主启动类上添加@ComponentScan(basePackages = {"你的Service所在包", "你的Repository所在包"}),确保Spring能扫描到这些组件。
内容的提问来源于stack exchange,提问作者Omprakash Dhakad
相关产品推荐
相关产品推荐

