2012-06-06 6 views
5

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.

Antwort

2

Von der Verdauung mehrere verschiedene Antworten hier und anderswo, die Lösung, die ich angenommen habe, ist die Verwendung der @Typed Annotation mit einem Wert von Object.class auf meiner Bohne.Dies bedeutet, dass es nur in Betracht kommen, in Felder injiziert werden, die wie folgt erklärt werden:

@Inject 
private Object something; 

... das zum Glück beweist ziemlich nicht existent sein. :-)

1

Was ich möchte, ist irgendwie die Produktion von Person Instanzen in dieser Anwendung durch den Hersteller Methode immer Weg zu zwingen, zu tun.

Nahtlot has a solution für dieses.

Ich bin nicht 100% sicher, wie dies mit der Zusammenführung von Seam 3 und Deltaspike (die Seite ist so 90er, aber der Inhalt rockt :-), aber Putting Solder in Ihrem Klassenpfad ist sicherlich eine sichere Wette.

Oh, und soweit ich weiß, hat es ein vergleichbarer Mechanismus in die CDI 1.1 Spezifikation geschafft.

+0

Also im Grunde: kann es nicht erzwingen, außer mit der '@ Typed' Annotation in CDI 1.0? –

+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" ...!? –

+0

'@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. –

3

Beschriften Sie PersonBean als @Alternative, dann wird die Producer-Methode verwendet.

Verwandte Themen