Pergunta

Digamos que eu tenho uma interface chamada SocialNetworkService, e três implementações - TwitterService, FacebookService e FriendFeedService.

Agora eu quero, sempre que meu feijão gerenciado (ou qualquer componente da web) receber uma mensagem, para compartilhá -la em todas as redes sociais. Eu tentei:

@Inject private List<SocialNetworkService> socialNetworkServices;

Mas não funcionou (erro de implantação). (Também tentou o @Any Qualificador - o mesmo resultado)

Então, existe uma maneira de injetar uma lista de todas (ou algumas) implementações de uma interface?

Sei a regra de que um determinado ponto de injeção não deve ter mais de um possível feijão. Acho que posso conseguir isso fazendo um produtor que produz a lista e usando Instance<SocialNetworkService>, mas isso parece demais para essa tarefa.

Foi útil?

Solução

Combinando minhas tentativas com uma resposta do fórum de solda:

@Inject @Any
private Instance<SocialNetworkService> services;

Instance implementos Iterable, então é possível simplesmente usar o loop for-cada. o @Any É necessário qualificador.


Outra maneira de fazer isso é usando o sistema de eventos:

  • Crie um MessageEvent (contendo todas as informações sobre a mensagem)
  • Em vez de injetar uma lista de redes sociais, basta injetar o evento:

    @Inject private Event<MessageEvent> msgEvent;
    

    e atire: msgEvent.fire(new MessageEvent(message));

  • Observe o evento em todos os serviços (independentemente de sua interface, que pode ser uma vantagem):

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

Outras dicas

Eu dei uma olhada na especificação JSR-299 e não parece que você possa fazer o que deseja fazer com facilidade e não tenho experiência o suficiente com solda para fornecer código para este caso especial.

No entanto, com base no capítulo 12.3 "Discovery Bean", você poderá declarar as implementações como @alternativo (para evitar a solda reclamar das várias implementações) e ouvir eventos do ProcessBean para coletar quando são vistas implementações do SocialNetworkService.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top