Could not autowire. There is more than one bean of 'MessageChain' type

Всем привет, столкнулся с такой проблемой, хотел заимплементировать максимально несвязанную цепь обязаностей через Spring. Идея заключалась в том, чтобы в конфигурации передавать абстрактный класс и автоматически привязывать следующую цепь, если она существует, если её нет, чтобы просто передавалось значение null.

Столкнулся с проблемой - Could not autowire. There is more than one bean of 'MessageChain' type.

конфиг

Как видно на скриншоте, в первом случае, spring просит квалифицировать бин либо указать его явно, как я сделал с secondChain.

Вопрос следующий, выйдет ли через спринг сделать настолько неявную привязку? Мне это нужно для того, чтобы при создании новой цепочки не прописывать её в предыдущей а просто дописать в конфиг. Если нет, подскажите пожалуйста возможные способы решения этой проблемы.


Ответы (2 шт):

Автор решения: Vladimir Shefer

Кажется, тебе нужно иметь несколько реализаций одного интерфейса в контекте.

Для этого ты можешь объявить несколько компонентов одного типа (MessageChain)

@Bean
public static MessageChain messageChain1(){...}
@Bean
public static MessageChain messageChain2(){...}
@Bean
public static MessageChain messageChain3(){...}

, а затем инжектить их сразу списком.

@Autowired
private List<MessageChain> messageChains;

Я вижу, что тебе нужно, чтобы chain-ы были в определенном порядке. Для этого ты можешь отнаследовать MessageChain от интерфейса Ordered. Тогда Spring автоматически отсортирует все chain-ы по значению метода getOrder()

Удачи!

→ Ссылка
Автор решения: ThePrettyFace

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

Мы можем создать очередь и тянуть из неё элементы, метод poll() позволит нам не словить нал поинтер а просто вставить налл, если в очереди нету элементов нашей цепи, что будет актуально для первой цепи, так как в очереди не будет элементов. В дальнейшем с помощью метода element() мы сможем вытянуть первую цепочку для конфигурации остальных модулей.

→ Ссылка