2014-11-21 22 views
6

Xem xét một khởi động mùa xuân CommandLineRunner Ứng dụng, tôi muốn biết làm thế nào để lọc các tùy chọn "chuyển đổi" được chuyển đến Spring Boot như cấu hình bên ngoài.Khởi động mùa xuân CommandLineRunner: lọc đối số tùy chọn

Ví dụ, với:

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

tôi có thể gọi java -jar myJar.jar /tmp/file1 /tmp/file2 và dịch vụ sẽ được gọi cho cả tập tin.

Nhưng nếu tôi thêm thông số Spring, như java -jar myJar.jar /tmp/file1 /tmp/file2 --spring.config.name=myproject thì tên cấu hình được cập nhật (phải!) Nhưng dịch vụ cũng được gọi cho tệp ./--spring.config.name=myproject, tất nhiên là không tồn tại.

Tôi biết tôi có thể lọc bằng tay trên tên tập tin với một cái gì đó giống như

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

Nhưng như tất cả các thành phần này đến từ mùa xuân, tôi tự hỏi, nếu không có một tùy chọn ở đâu đó để cho nó quản lý nó, và để đảm bảo thông số strings được chuyển đến phương thức run sẽ không chứa tất cả các tùy chọn thuộc tính đã được phân tích cú pháp ở cấp Ứng dụng.

Trả lời

6

Nhờ báo cáo nâng cao @AndyWilkinson, giao diện ApplicationRunner đã được bổ sung trong mùa xuân Boot 1.3.0 (vẫn còn trong mốc lịch sử tại thời điểm này, nhưng sẽ sớm được phát hành Tôi hy vọng)

Đây là cách sử dụng và giải quyết vấn đề:

@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

Không có hỗ trợ cho điều này trong Spring Boot tại thời điểm này. Tôi đã mở an enhancement issue để chúng tôi có thể xem xét việc phát hành trong tương lai.

+0

Cảm ơn bạn đã xem xét! –

+0

Có bất kỳ tin tức nào liên quan đến điều đó không? Ít nhất một nghìn người trong 6 tháng qua đã xem câu hỏi này. –

+0

Có vẻ như điều này đã được giải quyết, chúng ta có ví dụ về cách sử dụng 'ApplicationArguments' ngay bây giờ không? – Jackie

1

Một tùy chọn là sử dụng Commons CLI trong lần chạy() của lệnh CommandLineRunner của bạn.

Có một số liên quan question mà bạn có thể quan tâm.

+0

Vâng, khi bạn thấy danh sách các lựa chọn thay thế ... đây chính là lý do tại sao tôi muốn Spring chọn cho tôi cách nó được thực hiện mà không phải điều tra tất cả có thể có nghĩa là để làm điều đó. Cảm ơn bạn! –

+0

đây là một lựa chọn tuyệt vời – aliopi

1

Dưới đây là một giải pháp:

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

Sau đó chạy chương trình:

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

Cảm ơn! Nhưng đó vẫn là một cách giải quyết, và tôi nghĩ rằng chúng tôi sẽ mất ở đây sự quan tâm của việc có một giao diện CommandLineRunner được cung cấp bởi Spring. –

Các vấn đề liên quan