2016-04-07 9 views
3

Ich habe eine Klasse mit Feldern mit @Inject kommentiert. Ich instanziiere die Klasse mit Reflektion, aber ich möchte, dass die CDI Instanzen injiziert, um die Klasseninstanzfelder auszuführen. Gibt es eine Möglichkeit, es zu tun?Java EE 7 CDI Manuelle Instantiierung

Object myInstanceWithDependecies = Class.forName(“com.package.MyClass").newInstance(); 
CDI.injectAll(myInstanceWithDependecies);//This is what i want 

Weiß jemand, wie man das macht? Ich würde mich freuen, wenn es eine Möglichkeit gäbe, ohne jedes Feld durch Reflexion zu scannen.

Vielen Dank im Voraus.

+0

CDI hat wirklich Dokumentation, an welcher Stelle würden Sie über Producer Methoden lesen: https://docs.oracle.com/javaee/6/tutorial/doc/gjdid.html. – Gimby

+0

Soll dies JUnit Tests schreiben oder aus anderen Gründen? – tak3shi

+1

Ich weiß, es hat eine Dokumentation, ich war dort und ich habe es gelesen. Das Problem ist, dass Sie mein Problem nicht verstehen. Ich kenne Herstellermethoden und -felder. Sie helfen mir nicht, mein Problem zu lösen. Ich mache die Klasse selbstständig. Kannst du sehen, dass die Klasse, die ich instanziiere, dynamisch ist? Ich brauche eine Möglichkeit, die CDI aufzurufen und ihr zu sagen, dass sie die Injektion auf meiner Objektinstanz ausführen soll. –

Antwort

3

Dies bringt den Job fertig

SomeBean-Bean = CDI.current(). Select (SomeBean.class) .get();

0

Um CDI Abhängigkeiten aufgelöst zu haben, die Instanz von com.package.MyClass hat eine Managed Bean sein (durch den Container instanziiert), ist es, wenn nicht nicht möglich ist, der Behälter seine Abhängigkeiten auflösen zu lassen.

Ihr Problem zu lösen, die Sie sich selbst ohne die Erstellung der Instanz eine programmatische Lookup tun könnte:

CDI.current().select(Class.forName("com.package.MyClass")).get() 
//remember to check for ambiguous or unsatisfied dependency 
0

Wenn Ihr com.package.MyClass nicht von CDI verwaltet, ist es nicht möglich, durch Standard-CDI ist die Abhängigkeiten zu injizieren, wies darauf hin, Von anderen.

Allerdings ist die gesamte Infrastruktur verfügbar. DeltaSpike bietet die Funktionalität, nach der Sie suchen. Es ist auch möglich, dieses Codefragment (ohne Abhängigkeiten von anderem DeltaSpike-Code) ohne DeltaSpike zu verwenden.