Как внедрить бин в класс Spring Condition? - PullRequest
0 голосов
/ 29 августа 2018

Я определяю условия, которые позже проверю для динамической загрузки одной из двух реализаций моего интерфейса службы.

@Component
public class IsPolicyEnabled implements Condition {

    @Autowired
    private MyProperties props;

    @Override
    public boolean matches(ConditionContext arg0, AnnotatedTypeMetadata arg1) {
        return props.isPolicyEnabled();
    }

}

А

@Component
public class MyProperties {...}

И

@Service
@Conditional(IsPolicyEnabled.class)
public class ServiceA implements Service {...}

Тем не менее, я сталкиваюсь с ошибкой во время выполнения, как.

java.lang.IllegalStateException: Failed to load ApplicationContext
Caused by: java.lang.NullPointerException
at com.xyz.utils.IsPolicyEnabled.matches(IsPolicyEnabled.java:9)
at org.springframework.context.annotation.ConditionEvaluator.shouldSkip(ConditionEvaluator.java:108)
at org.springframework.context.annotation.ConditionEvaluator.shouldSkip(ConditionEvaluator.java:88)
at org.springframework.context.annotation.ConditionEvaluator.shouldSkip(ConditionEvaluator.java:71)
at org.springframework.context.annotation.ClassPathScanningCandidateComponentProvider.isConditionMatch(ClassPathScanningCandidateComponentProvider.java:515)

По сути, ему не удалось инициализировать объект props, который был автоматически подключен внутри реализации условия. Разве это не разрешено?

Как я могу автоматически связать другую зависимость внутри реализации условия, так как моя оценка состояния зависит от значения, предоставленного этой зависимостью?

1 Ответ

0 голосов
/ 29 августа 2018

Условия проверяются непосредственно перед , определение бина должно быть зарегистрировано [...]

Condition, Spring Framework 5.0.8.RELEASE API документация

Вы не можете внедрить bean-компонент в экземпляр Condition, поскольку в контексте еще нет определений bean-компонентов 1 .

Более того, вы не должны работать с bean-компонентами в Condition классах:

Условия должны следовать тем же ограничениям, что и BeanFactoryPostProcessor и , чтобы никогда не взаимодействовать с экземплярами bean .

Condition, Spring Framework 5.0.8.RELEASE API документация

Вы должны переосмыслить дизайн, потому что

[...] моя оценка состояния зависит от значения, предоставленного этой зависимостью.

означает, что это не совсем правильно.

1 Точнее говоря, Spring уже зарегистрировал несколько бобов для собственных нужд.

...