Tôi có một lớp học mùa xuân @Configuration
nên đăng ký một bean khi giá trị thuộc tính cụ thể được đặt trong môi trường. Tôi đã viết một triển khai thực hiện Condition
tùy chỉnh đã kiểm tra xem giá trị có hiện diện hay không và nó hoạt động khi tôi khởi chạy ứng dụng trong Spring Boot, nhưng bean chưa bao giờ được đăng ký khi chạy các kiểm tra JUnit. Tôi đã gỡ lỗi ứng dụng và xác định rằng Condition
đã được đánh giá trước khi PropertySourcesPlaceholderConfigurer
được khởi tạo.Làm cách nào để trì hoãn việc đánh giá chú thích cấu hình Spring @Conditional?
Tôi đã sửa đổi Condition
để triển khai ConfigurationCondition
và chỉ định đánh giá trong giai đoạn REGISTER_BEAN
. Phương thức này vẫn được gọi trước khi trình cấu hình được khởi tạo, nhưng bean đã đăng ký bây giờ đến và đi khi tôi thêm hoặc loại bỏ thuộc tính từ tệp thuộc tính.
Đây có phải là cách tốt nhất để sắp xếp lại đánh giá không? Đây có phải là giao diện của ConfigurationCondition
dành cho hay tôi chỉ vô tình làm việc đó ngay bây giờ?
@Conditional(PropertyCondition.class)
@Configuration
public class PostbackUrlConfiguration {
@Value("${serviceName.postbackUrl}")
String postbackUrl;
@Bean
public PostbackUrlProvider provider() {
return new FixedUrlProvider(postbackUrl);
}
}
public class PropertyCondition implements ConfigurationCondition {
@Override
public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {
return context.getEnvironment().containsProperty("serviceName.postbackUrl");
}
@Override
public ConfigurationPhase getConfigurationPhase() {
return ConfigurationPhase.REGISTER_BEAN;
}
}
Cấu hình thử nghiệm là một lớp tĩnh trên trường hợp thử nghiệm của tôi:
@Configuration
@ComponentScan
@PropertySource("classpath:/postback.properties")
@Import(PostbackUrlConfiguration.class)
public static class TestConfig {
@Bean
public static PropertySourcesPlaceholderConfigurer propertySourcesPlaceholderConfigurer() {
return new PropertySourcesPlaceholderConfigurer();
}
}
Bạn có đang sử dụng chú thích @ Cấu hình và @ Bean để khai báo PropertySourcesPlaceholderConfigurer trong Bài kiểm tra JUnit của mình không? –
@ Jean-PhilippeBond Có, và PSPC là 'tĩnh' theo một số yêu cầu tôi thấy cho loại thành phần đặc biệt. Đã đăng lớp cấu hình thử nghiệm đầy đủ. – chrylis