Ein Teil meines Problems hier ist die Verwendung des richtigen Vokabulars, so entschuldige ich mich im Voraus für das, was eine einfache Frage der Terminologie sein könnte.Wie erzwinge ich die Verwendung einer CDI-Producer-Methode?
Angenommen, ich habe eine Person
Schnittstelle und eine PersonBean
Klasse, die diese Schnittstelle implementiert.
Angenommen, ich habe irgendwo eine Producer-Methode (mit der Anmerkung @Produces
), die eine Person
zurückgibt. Intern gibt es einen neuen PersonBean
, aber das ist weder hier noch dort.
Schließlich nehme ich einen anderen CDI Bean irgendwo mit einer Injektionsstelle wie folgt definiert:
@Inject
private Person person;
Angenommen, ich habe alle meine beans.xml
Dateien anstelle usw. und haben Weld oder ein anderes Bootstrap-CDI-1.0-konform Umgebung, da dies alles steht, werde ich einen mehrdeutigen Definitionsfehler bekommen. Das macht Sinn: Weld wird meine PersonBean
als Injektionskandidat finden (es könnte einfach den Konstruktor aufrufen) und findet die Ausgabe meiner Producer-Methode als Injektionskandidat.
Was ich gerne tun würde, ist die Produktion von Person
Instanzen in dieser Anwendung zwingen, immer durch die Producer-Methode zu routen.
Ich verstehe, ich könnte etwas Qualifier irgendwo erfinden und die Producer-Methode produzieren Person
Instanzen, die von diesem Qualifier qualifiziert sind. Wenn ich das tue und meinen Injektionspunkt so ändere, dass er den Qualifier enthält, dann gibt es offensichtlich nur eine Quelle für diese qualifizierten Injektionen (nämlich meine Producer-Methode), also voila, Problem gelöst.
Aber angenommen, ich möchte nicht einige falsche Qualifier erfinden. (Ich sage nicht, dass das der Fall ist; versuche nur, die Probleme tiefer zu verstehen.) Was sind meine Optionen? Habe ich welche? Ich glaube, ich @Typed(Object.class)
auf dem PersonBean
setzen könnte es zu machen, so dass sie nicht als Person
von CDI ....
begrüßt Irgendwelche Ideen gesehen wurde, einschließlich Verweise auf Dokumentation, oder bessere Möglichkeiten, dies zu verstehen. Vielen Dank.
Also im Grunde: kann es nicht erzwingen, außer mit der '@ Typed' Annotation in CDI 1.0? –
Ich bin mir nicht sicher, ob ich Ihren Kommentar verstehe. Sie können die Produktion selbständig erzwingen, indem Sie '@ Unwraps' von Solder verwenden. Und in CDI gibt es keine "@Typed" ...!? –
'@Typed': http://docs.oracle.com/javaee/6/api/javax/enterprise/inject/Typed.html Kurz gesagt, Sie drosseln die Bean-Typen zurück, die Ihre Bean den CDI-Innereien aussetzt. Es wäre eine Möglichkeit, der CDI-Maschinerie zu sagen, dass sie ihre Hände von Ihrem Objekt fernhalten soll und es Ihrer Produzentenmethode erlaubt, sie direkt zu instantiieren. Mein Anwendungsfall ist das Erstellen einer 'Logger'-Instanz (kein no-arg-Konstruktor!), Damit ich die Art von' LogRecord' steuern kann, die bei der Protokollierung erstellt wird. –