Внесенный список объектов в CDI (сварной шва)

StackOverflow https://stackoverflow.com/questions/4009388

  •  25-09-2019
  •  | 
  •  

Вопрос

Скажем, у меня есть интерфейс под названием SocialNetworkService, и три реализации - TwitterService, FacebookService а также FriendFeedService.

Теперь я хочу, когда мой управляемый боб (или любой веб-компонент) получает сообщение, чтобы поделиться им во всех социальных сетях. Я старался:

@Inject private List<SocialNetworkService> socialNetworkServices;

Но это не сработало (ошибка развертывания). (Также пытался @Any Квалификатор - тот же результат)

Итак, есть ли способ ввести список всех (или некоторых) реализаций интерфейса?

Я знаю правило, что данная точка впрыска не должна иметь более одного возможного компонента. Я думаю, я могу достичь этого, сделав производитель, который производит список и использование Instance<SocialNetworkService>, но это кажется слишком много для этой задачи.

Это было полезно?

Решение

Объединение моих попыток с ответом с форума сварного сварного шва:

@Inject @Any
private Instance<SocialNetworkService> services;

Instance внедрение Iterable, Так что тогда можно просто использовать для каждого цикла. То @Any Квалификатор необходим.


Еще один способ сделать это, используя систему событий:

  • создать MessageEvent (Содержание всей информации о сообщении)
  • Вместо введения списка социальных сетей, просто введите событие:

    @Inject private Event<MessageEvent> msgEvent;
    

    и огонь это: msgEvent.fire(new MessageEvent(message));

  • Соблюдайте событие во всех службах (независимо от их интерфейса, который может быть плюс):

    public void consumeMessageEvent(@Observes MessageEvent msgEvent) {..}
    

Другие советы

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

Однако, основываясь на главе 12.3 «Discovery Bean», вы сможете объявить о реализациях @ @ альтернативы (чтобы избежать сварного шва возникать за несколькими реализациями) и прослушивать события процесса, чтобы собрать, когда рассматриваются реализации SocialNeworkservice.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top