2010-07-19 29 views
7

Tôi đã sử dụng chú thích @Required cho đến bây giờ để đảm bảo DI của hạt của tôi trong một ứng dụng cấu hình Spring.Cách biến Spring @Autowired thuộc tính bắt buộc thành false để kiểm tra?

Để bật chú thích, bạn cần khai báo bean RequiredAnnotationBeanPostProcessor trong cấu hình của bạn.

Trong cấu hình thử nghiệm của bạn, bạn chỉ cần không khai báo nó, để nếu một số đậu không cần thiết, bạn không cần phải có chúng trong cấu hình của bạn.

Tôi muốn chuyển sang ít XML hơn và sử dụng chú thích @Autowired, nhưng theo mặc định được yêu cầu = true, điều này là tốt cho cấu hình thời gian chạy.

Nhưng tôi cần @Được yêu cầu được yêu cầu = false chỉ cho mục đích thử nghiệm - trong khi vẫn giữ nó trong thời gian chạy.

Có thể không? Tôi không thể tìm cách để tuyên bố biến thuộc tính bắt buộc thành false.

cổ vũ

Trả lời

9

Bạn có thể đã giải quyết xong nhưng mẹo này có thể hữu ích cho người khác.

Theo như tôi đã hiểu mà không có ngữ cảnh : hướng chú thích hiện diện @ Chú thích không nên được xử lý nhưng điều này rõ ràng không phải là trường hợp để tôi có thể hiểu nhầm điều gì đó.

Tuy nhiên, tôi cần một giải pháp nhanh ... Thủ thuật hơi bẩn này phủ nhận giá trị bắt buộc cho tất cả các lớp làm cho tùy chọn những gì được yêu cầu trước đó. Thêm nó vào ngữ cảnh thử nghiệm của tôi giải quyết được sự cố của tôi nhưng nó chỉ hữu ích nếu tất cả các autowirings được yêu cầu trong các lớp học kinh doanh của bạn.

<bean class="org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor"> 
    <property name="requiredParameterValue" value="false" /> 
</bean> 
+1

Độ chính xác: để làm việc này, nó phải được đặt trước , nếu không nó sẽ không được tính đến. – nodje

0

Bạn có thể sử dụng kỹ thuật tương tự như bạn đã làm với @Required - không đăng ký AutowiredAnnotationBeanPostProcessor trong bối cảnh thử nghiệm của bạn, nhưng để nó trong bối cảnh sống của bạn.

Điều này thường được đăng ký bằng cách thêm <context:annotation-driven/>, thay vì được khai báo theo cách thủ công.

+0

Chờ một phút, nếu bạn không thêm , Spring không thậm chí phát hiện chú thích @Autowired, phải không? Những gì tôi muốn, tốt nhất, nhưng tôi chắc chắn nhiều người đã phải đối mặt với vấn đề, là phải có mùa xuân nạp , tức là phát hiện chú thích, nhưng lần lượt mặc định @Autowired (bắt buộc = true) để sai, vì vậy mà tôi không phải tiêm phụ thuộc được yêu cầu trong thời gian chạy nhưng không hữu ích, hoặc thậm chí không chào đón, trong chế độ thử nghiệm. – nodje

+0

@nodje: Đủ công bằng, nhưng đó không phải là cách nó hoạt động, tôi sợ. – skaffman

2

tôi làm việc ra một giải pháp mà làm việc cho các cấu hình JavaConfig

@ContextConfiguration(initializers={DisableAutowireRequireInitializer.class}) 
public class TestCase { 
    // Some tests 
} 
public class DisableAutowireRequireInitializer implements ApplicationContextInitializer<ConfigurableApplicationContext> { 

@Override 
public void initialize(ConfigurableApplicationContext applicationContext) { 

    // Register the AutowiredAnnotationBeanPostProcessor while initalizing 
    // the context so we get there before any @Autowire resolution happens 
    // We set the "requiredParameterValue" so that @Autowire fields are not 
    // required to be resolved. Very useful for a test context 
    GenericApplicationContext ctx = (GenericApplicationContext) applicationContext; 
    ctx.registerBeanDefinition(AnnotationConfigUtils.AUTOWIRED_ANNOTATION_PROCESSOR_BEAN_NAME, 
      BeanDefinitionBuilder 
       .rootBeanDefinition(AutowiredAnnotationBeanPostProcessor.class) 
       .addPropertyValue("requiredParameterValue", false) 
       .getBeanDefinition()); 

    } 

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