启动应用程序时的进程顺序

问题描述

我有一个关于在 Spring-Boot 中初始化数据的问题。 我有这个:

@PostConstruct
    public void run() {
        try {
            upload(path);
            logger.info("Seeding dictionary database...");
        } catch (IOException e) {
            //.....
        }
    }

run() 方法读取 .json 文件并在应用程序启动时用文件中的信息填充数据库。但我也有一个 .sql 文件,它在启动时也会填充数据库。从 .sql 文件初始化创建的表与从 .json 文件创建的表相关

当应用程序启动时我有

enter image description here

INSERT INTO "USER_DICTIONARY"("DICTIONARY_ID","USER_ID") VALUES (1,0)

我的 import.sql 中有这一行,但这会导致错误,因为 DICTIONARY_ID 不存在 jet,因为它来自 import.sql 后加载的 .json 文件 执行sql文件时,需要从.json文件中检索到的数据才能正确映射此表。

是否可以在执行 .sql 文件之前执行我的 run() 方法,或者可以通过其他方式解决?如果是这样,请帮我找到答案。

解决方法

为数据库做种的一种选择是在 Spring Boot 中使用 CommandLineRunner。

示例:

@Component
public class UserDataLoader implements CommandLineRunner {

@Autowired
UserRepository userRepository;

@Override
public void run(String... args) throws Exception {
    loadUserData();
}

private void loadUserData() {
    if (userRepository.count() == 0) {
        User user1 = new User("John","Doe");
        User user2 = new User("John","Cook");
        userRepository.save(user1);
        userRepository.save(user2);
    }
    System.out.println(userRepository.count());
}

}

CommandRunner 界面将在应用程序启动后立即执行。

另一种方法是使用 @EventListener 来监听应用程序的 ContextRefreshEvent。

示例:

@Component
public class DBSeed {
   @EventListener
   public void seed(ContextRefreshedEvent event) {
     try {
           upload(path);
           logger.info("Seeding dictionary database...");
       } catch (IOException e) {
           //.....
       }
    }
 }

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...