代码之家  ›  专栏  ›  技术社区  ›  opticyclic

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

  •  0
  • opticyclic  · 技术社区  · 8 年前

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

    如果我再加一个 @SpringBootApplication 实现的类 CommandLineRunner 对于project/jar,Spring与主服务器同时启动它。

    如果我添加一个初始化spring上下文本身的类,JPARepository上的jdbc url将使用缺省值,而不是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) {
    ....
    ....
    

    1 回复  |  直到 8 年前
        1
  •  1
  •   opticyclic    8 年前

    有几个步骤需要让这个工作。

    第一件事是 @SpringBootApplication

    例如

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

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

    • @组件扫描
    • @实体扫描

    第一个确保创建bean,第二个确保创建hibernate实体,第三个确保正确生成JPA类。

    最后一部分是禁用springbootwebserver的启动,否则会出现端口冲突。

    结果是:

    @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) {
    ....
    ....