@ Условная аннотация, вызывающая исключение BeanCreationException для вложенных bean-компонентов - PullRequest
0 голосов
/ 21 мая 2018

Я использую Spring 4.x, в котором я использую аннотацию @Conditional для управления регистрацией бина.У меня есть классы, определенные как указано ниже,

@Controller
class SchoolController{
   @Autowired
   @Qualifier("studentProcessor")
   private StudentProcessor studentProcessor;
   //Some code
}

@Component("studentProcessor")
class StudentProcessor{
   @Autiwired
   private SportService sportService;
   //Some code
}

@Component
@Conditional(ServiceCondition.class)
class SportService{
//Some code
}

class ServiceCondition implements Condition{
public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {
  //Some condition
}
}

Когда я запускаю Tomcat, я получаю следующее исключение: org.springframework.beans.factory.BeanCreationException: Ошибка при создании bean-компонента с именем 'studentProcessor': внедрение autowiredсбой зависимостей;вложенное исключение: org.springframework.beans.factory.BeanCreationException: не удалось автоматически связать поле: com.student.service.SportService com.student.processors.StudentProcessor.sportService;вложенное исключение - org.springframework.beans.factory.NoSuchBeanDefinitionException: не найден квалифицируемый компонент типа [com.student.service.SportService] для зависимости: ожидается, что по крайней мере 1 компонент, который квалифицируется как кандидат для автоматического подключения для этой зависимости.Аннотации зависимостей: {@ org.springframework.beans.factory.annotation.Autowired (обязательно = true)}

  1. Это ожидаемое поведение?
  2. Если нет, то как мне получитьизбавиться от этой проблемы?

1 Ответ

0 голосов
/ 23 мая 2018

Из вашей конфигурации, SportService bean-компонент загружен на основе условной реализации из ServiceCondition.

Итак, если метод matches по какой-то причине возвращает falseисходя из вашей логики, то SportService is не будет создан и не будет доступен для автоматической разводки.

При этом StudentProcessor не может иметь конкретного @Autowired для SportService.

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

@Autiwired
private SportService sportService;
//Some code

до

@Autiwired(required = false)
private SportService sportService;
//Some code

Далее вам необходимо проверить, введен ли экземпляр или нет, и затем использовать его.

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