2014-11-21 87 views
6

考慮到Spring Boot CommandLineRunner應用程序,我想知道如何篩選傳遞給Spring Boot的「開關」選項作爲外部配置。Spring Boot CommandLineRunner:篩選器選項參數

例如,使用:

@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,該服務將被調用這兩個文件。

但是,如果我添加一個彈簧參數,如java -jar myJar.jar /tmp/file1 /tmp/file2 --spring.config.name=myproject那麼配置名稱會更新(正確!),但該服務也被稱爲文件./--spring.config.name=myproject當然不存在。

我知道我可以手動過濾的文件名以類似

if (!filename.startsWith("--")) ... 

但作爲這一切的組件從春天來了,我不知道是否有沒有選擇的地方,讓它管理它,並確保傳遞給run方法的strings參數不包含應用程序級別已解析的所有屬性選項。

回答

6

由於@AndyWilkinson增強報告,在春季啓動在加入ApplicationRunner接口1.3.0(仍然是里程碑但是很快就會發布我希望)

這裏使用它的方式來解決問題:

@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); 
     } 
    } 
} 
2

目前在Spring Boot中沒有這方面的支持。我已打開an enhancement issue,以便我們可以考慮將來發布。

+0

感謝您考慮了! – 2014-11-25 08:41:11

+0

有沒有關於這方面的消息?過去6個月至少有一千人看過這個問題。 – 2015-06-17 11:26:51

+0

看起來像這樣已經解決了我們現在有一個如何使用'ApplicationArguments'的例子嗎? – Jackie 2016-08-08 14:05:26

1

一個選項是在CommandLineRunner impl的run()中使用Commons CLI

您可能有興趣的相關question

+0

那麼,當你看到替代品列表......這就是爲什麼我希望Spring選擇它的方式,而不必調查所有可能的手段來做到這一點。 無論如何,謝謝! – 2014-12-22 11:08:35

+0

這是一個很好的選擇 – aliopi 2016-02-10 09:11:52

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 
+0

謝謝! 但這仍然是一種解決方法,我認爲我們在這裏會失去使用Spring提供的CommandLineRunner接口的興趣。 – 2014-12-29 23:21:37