2015-01-08 27 views
5

Tôi có dịch vụ xác thực mà tôi muốn tự động định cấu hình khi chạy nhưng sẽ được mô phỏng để phát triển và thử nghiệm. Tôi muốn sử dụng tính năng @ConfigurationProperties để xác định các thông số cần thiết, nhưng tôi cũng cần có khả năng chỉ tạo điều kiện các trường hợp AuthenticationManager, tùy thuộc vào việc dịch vụ trực tiếp có được định cấu hình hay không.Khởi động mùa xuân có điều kiện trên @ConfigurationProperties

Cách tiếp cận tôi muốn thực hiện là sử dụng một cái gì đó như @ConditionalOnBean(AuthProperties.class), nhưng Khởi động mùa xuân tạo hạt đậu của lớp @ConfigurationProperties bất kể thuộc tính có mặt hay không. Tôi có thể áp dụng chú thích xác nhận cho các trường, nhưng sau đó ngữ cảnh sẽ không bắt đầu chút nào nếu một dịch vụ trực tiếp không được cấu hình.

Có cách nào để làm cho phần cấu hình có điều kiện khi có các thuộc tính được chỉ định trong lớp @ConfigurationProperties mà không lặp lại tên thuộc tính trong @ConditionalOnProperty?

+0

Các đối tượng '@ ConfigurationProperties' cũng có thể được sử dụng để chỉ định các giá trị mặc định, mà sẽ (dĩ nhiên) không được chọn bởi' @ ConditionalOnProperty'. Vì vậy, đây vẫn là một câu hỏi rất có liên quan. – P44T

Trả lời

0

Có thể bạn không chỉ cần sử dụng thông tin về tập tin application-some_profile.properties của bạn và sau đó tạo ra đậu tài sản của bạn có điều kiện như thế này

@Profile("some_profile") 
@Component 
@ConfigurationProperties(prefix = "some.selector") 

public Class YourConfiguration{ 
    private property option; 
} 

cách này nó chỉ được tạo ra điều kiện tùy chọn cấu hình nào trực tiếp hoặc giả . Hơn bạn có thể sử dụng cấu hình đã chọn cho các lớp xác thực cấu hình @ của bạn cho các cách tiếp cận riêng biệt hoặc theo dõi với @ConditionalOnBean. Đó là những gì hồ sơ được cho hoặc có thể tôi hiểu lầm câu hỏi.

+1

Toàn bộ điểm của hệ thống tự động cấu hình khởi động mùa xuân là để thích ứng với thông tin cấu hình bên ngoài mà không cần phải chỉ định các Toggles chỉ cung cấp thông tin thừa, về cơ bản là các tiểu sử nhỏ. – chrylis

+0

Xin lỗi tôi không để ý autoconfiguration.Nothing sạch nói đến cái tâm của tôi @Component @ConfigurationProperties (prefix = "some.selector") @Conditional (YourConfiguration.class) public class YourConfiguration thực hiện Điều kiện { lựa chọn sở hữu tư nhân; \t @ Override \t trận public boolean (ConditionContext bối cảnh, AnnotatedTypeMetadata metadata) { \t \t // một số tính chất hóa cứng kiểm tra \t trở lại (System.getProperty ("servicedefault") == null); \t} } 'không sạch nhưng đó là cách hoạt động của @Condidional, đậu sẽ được đăng ký theo điều kiện khác không đăng ký được – mariubog

0

Tôi đã có một vấn đề tương tự và tôi có thể giải quyết nó bằng phương pháp này sử dụng Spring Boot và Java 8, hy vọng nó sẽ giúp ai đó:

@Configuration 
@PropertySources({ 
    @PropertySource("classpath:integration.properties"), 
    @PropertySource(value = "classpath:integration-${spring.profiles.active}.properties", ignoreResourceNotFound = true) 
}) 
@ConfigurationProperties(prefix = "integration") 
public class IntegrationProperties { 

    private String user; 

    private String password; 

    private String projectId; 

    .... 

} 

integration.properties

integration.user=User 
integration.password=Password 
integration.project-id=123 

hội nhập -prod.properties

integration.project-id=897 

Khởi động mùa xuân sẽ tạo bean bằng cách sử dụng tệp thuộc tính và cho sản xuất (sử dụng cấu hình prod), nó sẽ sử dụng tệp khác và ghi đè project-id. ignoreResourceNotFound = true sẽ tránh FileNotFoundException khi khởi động khi bạn không sử dụng hồ sơ prod.

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