Inject Liste von Objekten in CDI (Weld)
-
25-09-2019 - |
Frage
Lassen Sie uns sagen, ich habe eine Schnittstelle namens SocialNetworkService
und drei Implementierungen -. TwitterService
, FacebookService
und FriendFeedService
Jetzt möchte ich, wenn mein Managed Bean (oder was auch immer Web-Komponente) eine Nachricht erhält, ist es in allen sozialen Netzwerken zu teilen. Ich habe versucht:
@Inject private List<SocialNetworkService> socialNetworkServices;
Aber es hat nicht funktioniert (Deployment-Fehler). (Auch versucht, den @Any
Qualifier - gleiches Ergebnis)
So ist es eine Möglichkeit, eine Liste aller (oder einiger) Implementierungen einer Schnittstelle zu injizieren?
Ich kenne die Regel, dass eine gegebene Injektionsstelle nicht mehr als eine mögliche Bohne haben sollte. Ich denke, ich kann das erreichen, indem er einen Produzenten zu machen, den die Liste erzeugt, und mit Instance<SocialNetworkService>
, aber das scheint, wie zu viel für diese Aufgabe.
Lösung
Die Kombination von meinen Versuchen mit einer Antwort aus dem Weld Forum:
@Inject @Any
private Instance<SocialNetworkService> services;
Instance
implementiert Iterable
, so dass es dann möglich ist, einfach zu verwenden, die für-jede Schleife. Die @Any
Qualifier benötigt wird.
Eine andere Möglichkeit, dies zu tun ist durch das Ereignissystem mit:
- erstellen
MessageEvent
(alle Informationen über die Nachricht enthält) -
statt eine Liste von sozialen Netzwerken Injektion einfach inject Ereignis:
@Inject private Event<MessageEvent> msgEvent;
und Feuer es:
msgEvent.fire(new MessageEvent(message));
-
beachten Sie die Veranstaltung in allen Dienstleistungen (unabhängig von ihrer Schnittstelle, das ist ein Plus sein könnte):
public void consumeMessageEvent(@Observes MessageEvent msgEvent) {..}
Andere Tipps
hatte ich einen Blick auf der JSR-299-Spezifikation und es scheint nicht, dass Sie das tun können, was Sie leicht tun wollen und ich Erfahrung genug, um nicht mit Weld hat Code für diesen speziellen Fall zu schaffen.
Allerdings basiert auf Kapitel 12.3 „Bean Entdeckung“ Sie die Implementierungen als @ Alternative ist zu erklären, vielleicht in der Lage (zur Vermeidung von Schweiß über mehrere Implementierungen beschweren) und ProcessBean Ereignisse hören zu sammeln, wenn Implementierungen von SocialNetworkService gesehen werden.