@Autowired 服务为空,但我需要创建新实例
@Autowired service is null but I need create new instance
我正在开发一个带有 Spring 启动的应用程序,我使用的是 MVC 模型。
我有一个名为 A 的实体,它有自己的控制器、服务和存储库。好的,在这里。
我有一个实用程序 class,它 运行 可用并在服务器启动时调用。此实用程序 class 创建一组 A 实体,然后将其存储到数据库中。问题是 class 的 autowired
服务为空,因为我创建了实用程序 class 的新实例以便 运行 它,所以 Spring 没有正确创建自动装配服务。
即:
Main.java
@SpringBootApplication
public class MainClass {
public static void main(String[] args) {
...
Runnable task = new Utility();
...
}
}
Utility.java
@Autowired
private Service service;
...
public void run() {
...
service.save(entities); <-- NPE
}
我知道 Spring 无法自动连接这个新实例的服务,但我需要创建实用程序实例才能 运行 它。
我试过通过application context访问服务,问题还是一样:
@Autowired
private ApplicationContext applicationContext;
我已经尝试 运行 启用控制器(服务已正确自动连接),但问题是一样的,因为我需要执行 new controller();
.
我已阅读这些帖子
post 1
,但任何解决方案都有效。
更新:我需要在新线程中执行任务 运行,因为它将每 X 小时执行一次。该任务从 Internet 下载数据集并将其保存到数据库中。
如果我没理解错的话,你是在试图用虚拟数据填充你的数据库。
This utility class create a set of A entities, and then, stored it
into database
为什么要使用 Runnable
?这个任务 运行 是通过一个新的 Thread
完成的吗?
如果没有,那么在你的 @Controller
中使用 @PostConstruct
,它可以访问右边的 @Service
。标记的方法保证在Bean完全构造完成,并且其所有依赖都满足后被调用。
@PostConstruct
private void persistEntities() {
...
service.save(entities);
}
如果你在 Spring 启动,你可以在 src/main/resources/
下放置一个 data-*.sql
文件。启动时它将是 运行。
如果您需要定期做一些任务:
@SpringBootApplication
@EnableScheduling
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application .class, args);
}
}
@Component
class Runner {
@Autowired
private Service service;
@Scheduled(cron = "0 */2 * * * ?") // execute every 2 hours
public void run() {
// put your logic here
}
}
正如@CoderinoJavarino 在评论中所说,我需要使用 @Scheduled
可运行实例 class。
有了计划,Spring 可以正确地自动装配服务。所以,最后,我最初的可运行实用程序 class 变成了预定的 class。
我正在开发一个带有 Spring 启动的应用程序,我使用的是 MVC 模型。 我有一个名为 A 的实体,它有自己的控制器、服务和存储库。好的,在这里。
我有一个实用程序 class,它 运行 可用并在服务器启动时调用。此实用程序 class 创建一组 A 实体,然后将其存储到数据库中。问题是 class 的 autowired
服务为空,因为我创建了实用程序 class 的新实例以便 运行 它,所以 Spring 没有正确创建自动装配服务。
即:
Main.java
@SpringBootApplication
public class MainClass {
public static void main(String[] args) {
...
Runnable task = new Utility();
...
}
}
Utility.java
@Autowired
private Service service;
...
public void run() {
...
service.save(entities); <-- NPE
}
我知道 Spring 无法自动连接这个新实例的服务,但我需要创建实用程序实例才能 运行 它。
我试过通过application context访问服务,问题还是一样:
@Autowired
private ApplicationContext applicationContext;
我已经尝试 运行 启用控制器(服务已正确自动连接),但问题是一样的,因为我需要执行 new controller();
.
我已阅读这些帖子
post 1
更新:我需要在新线程中执行任务 运行,因为它将每 X 小时执行一次。该任务从 Internet 下载数据集并将其保存到数据库中。
如果我没理解错的话,你是在试图用虚拟数据填充你的数据库。
This utility class create a set of A entities, and then, stored it into database
为什么要使用 Runnable
?这个任务 运行 是通过一个新的 Thread
完成的吗?
如果没有,那么在你的 @Controller
中使用 @PostConstruct
,它可以访问右边的 @Service
。标记的方法保证在Bean完全构造完成,并且其所有依赖都满足后被调用。
@PostConstruct
private void persistEntities() {
...
service.save(entities);
}
如果你在 Spring 启动,你可以在 src/main/resources/
下放置一个 data-*.sql
文件。启动时它将是 运行。
如果您需要定期做一些任务:
@SpringBootApplication
@EnableScheduling
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application .class, args);
}
}
@Component
class Runner {
@Autowired
private Service service;
@Scheduled(cron = "0 */2 * * * ?") // execute every 2 hours
public void run() {
// put your logic here
}
}
正如@CoderinoJavarino 在评论中所说,我需要使用 @Scheduled
可运行实例 class。
有了计划,Spring 可以正确地自动装配服务。所以,最后,我最初的可运行实用程序 class 变成了预定的 class。