Как превратить обязательное свойство Spring @Autowired в false для проверки? - PullRequest
8 голосов
/ 19 июля 2010

До сих пор я использовал аннотацию @Required, чтобы обеспечить DI моих bean-компонентов в приложении, сконфигурированном Spring.

Чтобы включить аннотацию, вам необходимо объявить bean-компонент RequiredAnnotationBeanPostProcessor в вашей конфигурации.

В вашей тестовой конфигурации вы просто не объявляете ее, поэтому, если некоторые бины не нужны, их не нужно включать в вашу конфигурацию.

Я хочу переключиться на меньшее количество XML и использовать аннотацию @Autowired, но она по умолчанию обязательна = true, что хорошо для конфигурации времени выполнения.

Но мне нужно @Autowired, чтобы быть обязательным = false только для целей тестирования - при сохранении его обязательным для времени выполнения.

Возможно ли это вообще? Я не могу найти способ декларативного преобразования требуемого свойства в false.

ура

Ответы [ 3 ]

11 голосов
/ 03 января 2012

Вы, вероятно, уже решили это, но этот трюк может быть полезен для других.

Насколько я понял, без контекста : наличие аннотации @ Аннотации с автопроводкой обрабатывать не нужно, ноэто явно не тот случай, поэтому я могу что-то неправильно понять.

Однако мне нужно было быстрое решение ... Этот несколько грязный трюк сводит на нет требуемое значение для всех классов, делая необязательным то, что требовалось раньше.Добавление его в мой тестовый контекст решило мою проблему, но это полезно только в том случае, если в ваших бизнес-классах требуются все автопроводки.

<bean class="org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor">
    <property name="requiredParameterValue" value="false" />
</bean>
5 голосов
/ 24 июня 2015

Я разработал решение, которое работает для конфигураций 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());

    }

}
0 голосов
/ 19 июля 2010

Вы можете использовать ту же технику, что и для @Required - не регистрируйте AutowiredAnnotationBeanPostProcessor в своем тестовом контексте, но оставьте его в своем реальном контексте.

Обычно это регистрируется добавлением <context:annotation-driven/> вместо объявления вручную.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...