Spring Boot CommandLineRunner:过滤器选项参数

时间:2014-11-21 11:09:00

标签: java spring command-line spring-batch spring-boot

考虑一个Spring Boot CommandLineRunner应用程序,我想知道如何过滤传递给Spring Boot的“switch”选项作为外部化配置。

例如,使用:

@Component
public class FileProcessingCommandLine implements CommandLineRunner {
    @Override
    public void run(String... strings) throws Exception {
        for (String filename: strings) {
           File file = new File(filename);
           service.doSomething(file);
        }
    }
}

我可以调用java -jar myJar.jar /tmp/file1 /tmp/file2,并且将为这两个文件调用该服务。

但是如果我添加一个Spring参数,比如java -jar myJar.jar /tmp/file1 /tmp/file2 --spring.config.name=myproject,那么配置名称就会更新(正确!),但服务也会调用文件./--spring.config.name=myproject,这当然不存在。

我知道我可以使用像

之类的东西手动过滤文件名
if (!filename.startsWith("--")) ...

但由于所有这些组件都来自Spring,我想知道是否有一个选项可以让它管理它,并确保传递给strings方法的run参数不包含在已在应用程序级别解析的所有属性选项。

3 个答案:

答案 0 :(得分:2)

目前在Spring Boot中没有对此的支持。我打开了an enhancement issue,以便我们可以考虑将来发布。

答案 1 :(得分:1)

一种选择是在CommandLineRunner impl的run()中使用Commons CLI

您可能感兴趣的是相关的question

答案 2 :(得分:1)

这是另一种解决方案:

@Component
public class FileProcessingCommandLine implements CommandLineRunner {

    @Autowired
    private ApplicationConfig config;

    @Override
    public void run(String... strings) throws Exception {

        for (String filename: config.getFiles()) {
           File file = new File(filename);
           service.doSomething(file);
        }
    }
}


@Configuration
@EnableConfigurationProperties
public class ApplicationConfig {
    private String[] files;

    public String[] getFiles() {
        return files;
    }

    public void setFiles(String[] files) {
        this.files = files;
    }
}

然后运行程序:

java -jar myJar.jar --files=/tmp/file1,/tmp/file2 --spring.config.name=myproject