![](/img/trans.png)
[英]No qualifying bean for autowired JPA repository in JUnit test in Spring Boot application
[英]Can't use @Autowired JPA Repository in Main method of Spring Boot application
我已经自动装配了一个 JPA 存储库,它在应用程序启动之前在我的 H2 数据库中添加了虚拟数据。 但是,为什么我不能在 main () 方法中使用它,但可以在 runner() 方法中使用它,有什么原因吗?
@SpringBootApplication
public class FullstackApplication {
@Autowired
private CarRepository carRepository;
private static final Logger logger = LoggerFactory.getLogger(FullstackApplication.class);
public static void main(String[] args) {
carRepository. // Here I get a compilation error: Cannot make a static reference to a non-static field
SpringApplication.run(FullstackApplication.class, args);
}
@Bean
CommandLineRunner runner(){
return args -> {
// Save demo data to database
carRepository.save(new Car("Ford", "Mustang", "Red",
"ADF-1121", 2017, 59000));
carRepository.save(new Car("Nissan", "Leaf", "White",
"SSJ-3002", 2014, 29000));
carRepository.save(new Car("Toyota", "Prius", "Silver",
"KKO-0212", 2018, 39000));
};
}
}
您正在直接从 java 中不允许的静态方法访问非静态字段
你也不能制作静态字段@Autowired
所以如果你这样做
@Autowired
private static CarRepository carRepository;
它不会抛出任何错误,但会被忽略。
Main 方法被标记为静态,这意味着,在那里使用的所有方法也应该是静态的,或者手动实例化。
您没有在 main 方法的静态主体中手动实例化 CarRepository,您依赖 Spring 在启动阶段的某个地方实例化它,这将在“carRepository. //....”这一行之后发生。
这就是为什么你不能在这个确切的地方使用 carRepository,因为它本身不是静态的,并且没有手动实例化。
但是在CommandRunner中,在调用return的时候,CarRepository的实例已经被Spring创建并自动绑定到field,因为Spring启动已经完成,可以很方便的使用。
好吧,主要方法被标记为静态,您不能从静态方法访问非静态成员。
为了解决这个问题,您必须将 carRepository 标记为静态。 但是由于静态字段不能自动装配,它会忽略它并且你不会得到对象。
它将在命令运行器中工作,因为那时 sprint 启动已经完成并且 bean 已经被实例化。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.