如何向我的Spring Boot Rest应用程序添加命令行应用程序

时间:2018-07-09 19:34:44

标签: java spring-boot

我有一个REST应用程序,可从数据库存储库读取。

我想添加一个命令行应用程序,该应用程序读取CSV并将数据导入数据库。

如果我向项目/ jar添加另一个实现@SpringBootApplication的{​​{1}}类,Spring将在与我的主服务器同时启动它。

如果我添加一个用于初始化spring上下文本身的类,则JPARepository上的jdbc url将使用默认值,而不是spring引导属性中的默认值

CommandLineRunner

有更好的方法吗?

1 个答案:

答案 0 :(得分:0)

要执行此操作,需要执行几个步骤。

第一件事是@SpringBootApplication自动扫描其下的所有程序包,并将自动启动找到的所有CommandLineRunner,因此命令行应用程序需要位于并行程序包中。

例如

- com
    - test
        - rest
            - model
            - repository
            - controller
          #RestSpringBoot.java
        - Commands
          #ImportCsv.java

接下来的事情是,由于命令行应用程序位于并行包中,因此您需要自行指定扫描内容。

这包括三个部分:

  • @ComponentScan
  • @EntityScan
  • @EnableJpaRepositories

第一个确保创建了Bean,第二个确保了创建了休眠实体,第三个确保了正确生成了JPA类。

最后一部分是禁用Spring Boot Web服务器的启动,否则您将遇到端口冲突。

这最终以:

@SpringBootApplication
@ComponentScan(basePackageClasses = {Repository.class})
@EntityScan(basePackageClasses = {MyEntity.class})
@EnableJpaRepositories(basePackageClasses = {Repository.class})
public class CsvImport {

@Autowired
private RiskRepository repository;

public static void main(String[] args) {
    SpringApplication app = new SpringApplication(CsvImport.class);
    app.setBannerMode(Banner.Mode.OFF);
    app.setWebApplicationType(WebApplicationType.NONE);
    app.run(args);
}

@Override
public void run(String... args) throws Exception {
    File file = new File(args[0]);
    if (file.isFile()) {
        importCsv(file);
    }
}

private void importCsv(File file) {
....
....