Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/383.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何将命令行应用程序添加到Spring Boot Rest应用程序_Java_Spring Boot - Fatal编程技术网

Java 如何将命令行应用程序添加到Spring Boot Rest应用程序

Java 如何将命令行应用程序添加到Spring Boot Rest应用程序,java,spring-boot,Java,Spring Boot,我有一个从数据库存储库读取的REST应用程序 我想添加一个命令行应用程序,用于读取CSV并将数据导入数据库 如果我将另一个实现CommandLineRunner的@SpringBootApplication类添加到项目/jar中,Spring会在启动主服务器的同时启动它 如果我添加一个初始化spring上下文本身的类,那么JPARepository上的JDBCURL将使用默认值,而不是spring引导属性中的默认值 spring.datasource.url=jdbc:h2:file:./tes

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

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

如果我将另一个实现
CommandLineRunner
@SpringBootApplication
类添加到项目/jar中,Spring会在启动主服务器的同时启动它

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

spring.datasource.url=jdbc:h2:file:./test;AUTO_SERVER=TRUE;DB_CLOSE_ON_EXIT=FALSE

@ComponentScan(basePackages = "com.test")
public class CsvImport {

@Autowired
private Repository repository;

public static void main(String[] args) {
    AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(CsvImport.class);
    context.start();

    CsvImport csvImport = context.getBean(CsvImport.class);
    File file = new File(args[0]);
    if (file.isFile()) {
        csvImport.importCsv(file);
    }
    context.stop();
}

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

有更好的方法吗?

要使其正常工作,需要几个步骤

第一件事是
@springbootplication
自动扫描它下面的任何包,并自动启动它找到的任何CommandLineRunner,因此命令行应用程序需要在一个并行包中

e、 g

下一件事是,由于命令行应用程序位于并行包中,因此您需要自己指定扫描

这有三个部分:

  • @组件扫描
  • @实体扫描
  • @授权代理
第一个确保创建bean,第二个确保创建hibernate实体,第三个确保正确生成JPA类

最后一部分是禁用spring引导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) {
....
....

如果您创建一个类似bean的文件并将CSV文件内容加载到一个服务中,然后请求该内容并将其放入数据库(然后删除服务中的内容,从而实现内存)。。。这样对你会更好吗?看起来有点复杂。我觉得我要么需要一种方法从主应用程序委托给不同的spring启动应用程序,要么需要将spring.datasource.url属性加载到一个经典的spring应用程序中,就像问题中的类一样。
@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) {
....
....