Spring Repository空指针异常:Spring Boot读取SQL Server数据报错
排查Spring Repository空指针异常的解决方案
我来帮你定位这个问题——你遇到的空指针异常,核心原因是依赖注入的时机不对,具体来说是在Spring完成依赖注入之前就调用了Repository的方法。
问题根源
在Spring的生命周期里,当你用@Autowired标注字段时,Spring会先执行类的构造方法创建实例,之后才会把依赖注入到对应的字段中。你的CustomersView在构造方法里直接调用customerRepository.findAll(),这时候customerRepository还没被Spring注入,自然是null,触发空指针异常。
两种有效解决方案
方案1:使用构造器注入(推荐)
这是Spring官方推荐的依赖注入方式,不仅能避免空指针,还让依赖关系更清晰,方便单元测试。修改CustomersView代码如下:
@Tag("customers-view") @HtmlImport("src/views/customers/customers-view.html") @Route(value = ApplicationConst.PAGE_CUSTOMERS, layout = MainView.class) @PageTitle(ApplicationConst.TITLE_CUSTOMERS) public class CustomersView extends PolymerTemplate<TemplateModel> { private final CustomerRepository customerRepository; // 通过构造器注入依赖,Spring会在创建实例时直接传入Repository @Autowired public CustomersView(CustomerRepository customerRepository) { this.customerRepository = customerRepository; // 此时Repository已经被注入,可以安全调用方法 customerRepository.findAll(); } }
方案2:使用@PostConstruct注解
如果更习惯字段注入,可以用@PostConstruct标注初始化方法,这个方法会在所有依赖注入完成后自动执行:
@Tag("customers-view") @HtmlImport("src/views/customers/customers-view.html") @Route(value = ApplicationConst.PAGE_CUSTOMERS, layout = MainView.class) @PageTitle(ApplicationConst.TITLE_CUSTOMERS) public class CustomersView extends PolymerTemplate<TemplateModel> { @Autowired private CustomerRepository customerRepository; public CustomersView() { // 构造方法里不要调用Repository的方法 } // 依赖注入完成后自动执行的初始化方法 @PostConstruct public void initData() { customerRepository.findAll(); } }
额外确认点
从你的Application类配置来看,@EnableJpaRepositories(basePackageClasses = CustomerRepository.class)已经正确指定了Repository的扫描范围,只要CustomerRepository和Application在同一个包或子包下,Spring就能正确实例化它,这部分应该没问题。
内容的提问来源于stack exchange,提问作者Birger Huysmans
相关产品推荐
相关产品推荐

