一尘不染

Spring Boot CommandLineRunner:过滤器选项参数

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方法的参数在应用程序级别已解析的所有属性选项中均不包含。


阅读 352

收藏
2020-05-30

共1个答案

一尘不染

感谢@AndyWilkinson增强报告,ApplicationRunner在Spring Boot
1.3.0中添加了接口(目前仍在Milestones中,但我希望很快会发布)

这里是使用它和解决问题的方法:

@Component
public class FileProcessingCommandLine implements ApplicationRunner {
    @Override
    public void run(ApplicationArguments applicationArguments) throws Exception {
        for (String filename : applicationArguments.getNonOptionArgs()) 
           File file = new File(filename);
           service.doSomething(file);
        }
    }
}
2020-05-30