Injetar lista de objetos no CDI (solda)
-
25-09-2019 - |
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.
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.