考虑一个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
参数不包含在已在应用程序级别解析的所有属性选项。
答案 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