Как внедрить несколько реализаций одного типа с помощью Spring Boot?JAVA

Программисты JAVA общаются здесь
Ответить
Anonymous
 Как внедрить несколько реализаций одного типа с помощью Spring Boot?

Сообщение Anonymous »

Мой класс RssStrategy внедряет класс RssConsumer. Существует несколько реализаций RssConsumer; поэтому Spring Boot выдает ошибку о том, что обнаружено несколько bean-компонентов одного и того же типа.
Исключение

Код: Выделить всё

Parameter 0 of constructor in 
.RssStrategy required a single bean, but 11 were found:
Как мне обойти эту проблему с помощью моей текущей реализации?
Я видел решения, в которых для определения того, на какую реализацию ссылаться, использовался квалификатор, но в моем случае RssStrategy.java не знает, и решение принимает сервис, внедряющий стратегию.
RssStrategy.java

Код: Выделить всё

@Component
public class RssStrategy implements FetchDataStrategy{

private final T rssConsumer;

public RssStrategy(T rssConsumer) {
this.rssConsumer = rssConsumer;
}

@Override
public void fetchData() {
rssConsumer.consume();
}
}
Различные реализации RssConsumer.java:

Код: Выделить всё

@Component(value = "rssConsumerA")
public class RssConsumerA extends RssConsumer {
@Override
public void consume() {}
}

@Component(value = "rssConsumerB")
public class RssConsumerB extends RssConsumer {
@Override
public void consume() {}
}
Внедрение RssStrategy в разные службы, но всегда передача другой реализации универсального типа:

Код: Выделить всё

@Service
public class ServiceA extends MyAbstractService {
public ServiceA ( RssStrategy fetchDataStrategy) {}

@Override
public void run() {fetchDataStrategy.fetchData()}
}

@Service
public class ServiceB extends MyAbstractService {
public ServiceB ( RssStrategy fetchDataStrategy) {}

@Override
public void run() {fetchDataStrategy.fetchData()}
}
Обновление: я нашел решение:
Единственная альтернатива, которую я нашел на данный момент, — это вместо внедрения rssConsumer, я предоставляю его через установщик, например:

Код: Выделить всё

@Component
public class RssStrategy implements FetchDataStrategy{

private final T rssConsumer;

public setRssConsumer(T rssConsumer) {
this.rssConsumer = rssConsumer;
}

@Override
public void fetchData() {
rssConsumer.consume();
}
}
И вместо этого внедрить Потребителя в Службу и предоставить его через метод установки:

Код: Выделить всё

@Service
public class ServiceA extends MyAbstractService {
public ServiceA ( RssConsumerA, rssConsumerA,
RssStrategy fetchDataStrategy) {
fetchDataStrategy.setRssConsumer(rssConsumerA);
}

@Override
public void run() {fetchDataStrategy.fetchData()}
}
Обновление 2:
Похоже, что мое решение тоже не работает. Хотя я предоставляю rssConsumer через установщик:

Код: Выделить всё

fetchDataStrategy.setRssConsumer(rssConsumerA);
Реальный потребитель кажется довольно случайным. Мне нужно изучить больше, но это неправильное поведение.

Подробнее здесь: https://stackoverflow.com/questions/764 ... pring-boot
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «JAVA»