Injecter de la liste des objets en CDI (Soudure)
Disons que j'ai une interface appelée SocialNetworkService
, et trois implémentations - TwitterService
, FacebookService
et FriendFeedService
.
Maintenant, je veux, à chaque fois que mon managed bean (ou autre composant web) reçoit un message, à le partager sur tous les réseaux sociaux. J'ai essayé:
@Inject private List<SocialNetworkService> socialNetworkServices;
Mais il ne fonctionne pas (erreur de déploiement). (Également essayé à la @Any
qualifier - même résultat)
Donc, est-il un moyen pour injecter une liste de tous les (ou certains) implémentations de l'interface?
Je sais que la règle qu'un point d'injection ne doit pas avoir plus d'un bean. Je suppose que je peux le faire en faisant un producteur qui produit de la liste, et à l'aide de Instance<SocialNetworkService>
, mais cela me semble trop pour cette tâche.
- Veux rester pur JSR 330?
- 330 et 299 .. Qui devrait être suffisante
Vous devez vous connecter pour publier un commentaire.
Combinant mes tentatives avec une réponse de la Soudure forum:
Instance
implémenteIterable
, de sorte qu'il est alors possible de simplement utiliser la boucle for-each. Le@Any
qualificatif est nécessaire.Une autre façon de faire cela est d'utiliser le système d'événement:
MessageEvent
(contenant toutes les informations sur le message)au lieu d'injecter une liste de réseaux sociaux, il suffit d'injecter de l'événement:
et le feu:
msgEvent.fire(new MessageEvent(message));
observer le cas dans tous les services (quel que soit leur interface, qui peut être un plus):
@Inject @Any Instance<Something> stuff;
n'est pas garantie.)J'ai eu un coup d'oeil à la JSR-299 spécification et il ne semble pas que vous pouvez faire ce que vous voulez faire facilement et je n'ai pas suffisamment d'expérience avec la Soudure à fournir le code de ce cas particulier.
Toutefois, en se fondant sur le chapitre 12.3 "de la Fève à la Découverte", vous pourriez être en mesure de déclarer que les implémentations de @Alternative (pour éviter la Soudure se plaignent de multiples implémentations) et d'écouter de la ProcessBean événements recueillir lorsque les implémentations de SocialNetworkService sont vus.