2014-11-21 13 views
6

Biorąc pod uwagę aplikację Spring Boot CommandLineRunner, chciałbym wiedzieć, jak filtrować opcje "przełączania" przekazane do Spring Boot jako konfigurację zewnętrzną.Spring Boot CommandLineRunner: argument opcji filtru

Na przykład z:

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

mogę zadzwonić java -jar myJar.jar /tmp/file1 /tmp/file2 a usługa zostanie wywołana dla obu plików.

Ale jeśli dodaję parametr Spring, np. java -jar myJar.jar /tmp/file1 /tmp/file2 --spring.config.name=myproject, to nazwa konfiguracji jest aktualizowana (prawy!), Ale usługa jest również wywoływana dla pliku ./--spring.config.name=myproject, który oczywiście nie istnieje.

wiem, że mogę filtrować ręcznie w pliku z czymś jak

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

Ale jak to wszystko składników pochodzi z wiosną, zastanawiam się, czy nie jest to opcja gdzieś niech zarządzać nimi, a także upewnij się, że parametr strings przekazany do metody run nie będzie zawierał wszystkich opcji właściwości już przeanalizowanych na poziomie aplikacji.

Odpowiedz

6

Dzięki @AndyWilkinson raportu akcesorium, ApplicationRunner interfejs dodano w Spring Boot 1.3.0 (jeszcze w Kamienie milowe w w tej chwili, ale wkrótce zostanie zwolniony, mam nadzieję)

Oto sposób korzystania z niego i rozwiązania problemu:

@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

Brak wsparcia w Spring Boot w tej chwili. Otworzyłem an enhancement issue, abyśmy mogli rozważyć to na przyszłe wydanie.

+0

Dzięki za przemyślane! –

+0

Czy są jakieś informacje na ten temat? Co najmniej tysiąc osób w ciągu ostatnich 6 miesięcy wyświetliło to pytanie. –

+0

Wygląda na to, że zostało to rozwiązane, czy mamy teraz przykład użycia 'ApplicationArguments' teraz? – Jackie

1

Jedną z opcji jest użycie Commons CLI w run() swojego impulsu CommandLineRunner.

Istnieje powiązany question, który może Cię zainteresować.

+0

Cóż, gdy widzisz listę alternatyw ... właśnie dlatego chciałbym, aby Spring wybrał dla mnie sposób, w jaki to robi, bez konieczności sprawdzania wszystkich możliwe środki do tego. Dzięki! –

+0

to doskonały wybór – aliopi

1

Oto inne rozwiązanie:

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

Następnie uruchom program:

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

Dzięki! Ale to wciąż jest obejście tego problemu i myślę, że stracilibyśmy tutaj zainteresowanie interfejsem CommandLineRunner dostarczonym przez Spring. –