![](/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.