Fehlerbehebung bei Contexts and Dependency Injection
Dieser Abschnitt enthält Informationen zur Behebung von Fehlern, die sich auf Contexts and Dependency Injection (CDI) für Java EE-Anwendungen (Java Platform, Enterprise Edition) beziehen.
Vorbereitende Schritte
Informationen zu diesem Vorgang
Wenn Sie eine CDI-Implementierung verwenden, können Fehler während der Anwendungsimplementierung oder bei der Interaktion von CDI mit anderen Java™ EE-Komponenten auftreten. Es können auch Probleme im Zusammenhang mit Erzeugern (Producer), Interceptor (Abfangprozessen) und Decorator oder dem Diagnosetrace auftreten. Führen Sie die hier beschriebene Aufgabe aus, um diese Fehler zu beheben.
Vorgehensweise
- Probleme mit der Anwendungsimplementierung beheben. Während der Anwendungsimplementierung muss der Container jeden Injektionspunkt in der Anwendung dahingehend
validieren, dass nur eine einzige Quelle dieser Abhängigkeit die Anforderungen des Injektionspunkts erfüllt.
Fehler vermeiden: Die Implementierung während des Betriebs wird in CDI-Anwendungen nicht unterstützt. Damit ein Update verfügbar ist, müssen Sie die Anwendung erneut starten.gotcha
- Mehrdeutige Abhängigkeiten auflösen.
Eine mehrdeutige Abhängigkeit oder eine Ausnahme des Typs javax.enterprise.inject.AmbiguousResolutionException tritt ein, wenn der Container den Typ und die Qualifikationsmerkmale eines Injektionspunkts in mehrere Managed Beans, Erzeugermethoden (Producermethoden) oder Erzeugerfelder (Producerfelder) auflöst.
Die Ausnahme teilt Ihnen den verarbeiteten Injektionspunkt und die infrage kommenden Beans mit, die am Ende des typsicheren Auflösungsprozesses verblieben sind. Alles andere als eine einzelne Bean ist ein Anwendungsfehler:
Zur Behebung des Fehlers führen Sie eine der folgenden Aktionen aus:org.jboss.weld.exceptions.DeploymentException: WELD-001409: Ambiguous dependencies for type OtherBean with qualifiers @Default at injection point [BackedAnnotatedField] @Inject private basic.injection.SimpleBean.bean at basic.injection.SimpleBean.bean(SimpleBean.java:0) Possible dependencies: - Managed Bean [class basic.injection.OtherBean] with qualifiers [@Any @Default], - Producer Method [OtherBean] with qualifiers [@Any @Default] declared as [[BackedAnnotatedMethod] @Produces basic.injection.OtherBeanProducer.produceOtherBean()]
- Lösen Sie die Mehrdeutigkeit des Injektionspunkts auf, indem Sie dem Injektionspunkt ein Qualifikationsmerkmal und ggf. eine einzige Abhängigkeitsquelle hinzufügen.
- Annotieren Sie gegebenenfalls eine der Quellen von Kontextinstanzen mit @Alternative oder @Specializes, falls einige der Abhängigkeiten nicht bei der Injektion berücksichtigt werden sollen.
- Auflösung einer nicht erfüllbaren Abhängigkeit. Eine nicht erfüllbare Abhängigkeit oder eine Ausnahme des Typs javax.enterprise.inject.UnsatisfiedResolutionException tritt ein, wenn für Objekte, die einem Injektionspunkt in der Anwendung entsprechen, es keine zugehörige Quelle gibt. Der API-Typ des Felds gibt zusammen mit der optionalen Gruppe von qualifizierenden Annotationen die Gruppe der Beans vor, die die Abhängigkeit erfüllen. Nicht erfüllbare Abhängigkeiten können die folgenden Ursachen haben:
- Es gibt keine Managed Bean, die dem Typ im Injektionspunkt zugeordnet werden kann.
- Es gibt keine Erzeugermethode in keiner Managed Bean, deren Rückgabetyp dem Injektionspunkt zugeordnet werden kann.
- Es gibt kein Erzeugerfeld in keiner Managed Bean, dessen Typ dem Injektionspunkt zugeordnet werden kann.
- Eines der zuvor beschriebenen Szenarien ist zwar gültig, aber die qualifizierenden Annotationen des Injektionspunkts sind nicht in der Bean oder im Erzeuger vorhanden.
Anmerkung: Beheben Sie den Fehler, indem Sie eine Abhängigkeit mit dem API-Typ und den verfügbaren Qualifikationsmerkmalen erstellen, indem Sie eine neue Bean einführen, Qualifikationsmerkmale entfernen oder Erzeugerfelder und -methoden hinzufügen. Abschnitt 5.2 der Spezifikation Contexts and Dependency Injection for Java beschreibt die typsichere Auflösung detailliert.org.jboss.weld.exceptions.DeploymentException: WELD-001408: Unsatisfied dependencies for type OtherBean with qualifiers @British at injection point [BackedAnnotatedField] @Inject @British private basic.injection.SimpleBean.bean at basic.injection.SimpleBean.bean(SimpleBean.java:0) WELD-001475: The following beans match by type, but none have matching qualifiers: - Managed Bean [class basic.injection.OtherBean] with qualifiers [@Any @Default], - Producer Method [OtherBean] with qualifiers [@Any @Default] declared as [[BackedAnnotatedMethod] @Produces basic.injection.OtherBeanProducer.produceOtherBean()]
- Auflösung von Abhängigkeiten für Auslagerungsbereiche. Auslagerung ist das Verschieben eines inaktiven Objekts, das im Speicher gehalten wird, in den Zusatzspeicher. Ein Auslagerungsbereich wie die integrierten Bereiche @SessionScoped und @ConversationScoped erfordert, dass jede Bean, die den Bereich verwendet, die Auslagerung unterstützt. Eine Bean unterstützt die Auslagerung, wenn sie eine Stateful Session-Bean oder eine andere verwaltete Managed Bean ist, die serialisierbar ist und keine nicht serialisierbaren Interceptor (Abfangprozesse) und Decorator hat. Abhängigkeiten für Auslagerungsbereiche können die folgenden Ursachen haben:
- Änderung des Bereichs einer vorhandenen Bean in einen Auslagerungsbereich, wie z. B. @SessionScoped oder @ConversationScoped.
- Hinzufügen von nicht serialisierbaren Decorator oder Interceptor zu einer vorhandenen Bean, die die Auslagerung unterstützt.
- Stellen Sie sicher, dass die fragliche Bean serialisierbar ist.
- Stellen Sie sicher, dass alle Interceptors und Decorators der Bean "serializable" implementieren.
- Ändern Sie den Bereich der Managed Bean in einen Bereich, der kein Auslagerungsbereich ist.
- Mehrdeutige Abhängigkeiten auflösen.
- Fehler beheben, die auf die Interaktion von CDI mit anderen
Java EE-Komponenten zurückzuführen sind.
Die Annotation @Inject stellt einen weiteren Typ einer Java EE-Abhängigkeitsinjektion bereit. Die in Java EE 5 definierte Beziehung zur Injektion ist folgende:
- Die Injektion mit anderen Annotationen als der Annotation @Inject verhält sich wie in den früheren Releases und nur Abhängigkeiten, die mit der Annotation "@Inject" injiziert werden, sind gemäß Contexts and Dependency Injection for Java (JSR299) Kontextinstanzen.
- Verwenden Sie Erzeugerfelder und Erzeugermethoden (Producer), um eingeschränkte CDI-Features (wie z. B. die typsichere Injektion) von Java EE-Abhängigkeiten bereitzustellen, die mit den Annotationen @Resource, @PersistenceContext, @PersistenceUnit und @WebServiceRef abgerufen werden.
Wenn Sie keinen Wert für eine Ausdruckssprachenreferenz (EL, Expression Language) auf eine Managed Bean für JavaServer Pages (JSP) und JSF-Komponenten (JavaServer Faces) abrufen können, sollten Sie die folgenden Ansätze in Erwägung ziehen:- Stellen Sie sicher, dass die Bean-Klasse mit der Annotation @Named oder mit einem Stereotyp annotiert wird, das die Annotation @Named definiert.
- Vergewissern Sie sich, dass der EL-Ausdruck nach der Konvertierung des ersten Zeichens in einen Kleinbuchstaben mit dem Klassennamen der Bean-Klasse übereinstimmt. Wenn Sie das Annotationsqualifikationsmerkmal @Named mit einem Wertelement verwenden (z. B. @Named("myName")), legt dieses den Bean-Namen (ein spezielles Qualifikationsmerkmal) fest, ändert aber nicht den EL-Namen der betreffenden Bean.
Für EJB-Komponenten:- Sie können Session-Beans mit den Annotationen @Inject und @EJB injizieren. Wenn Sie Stateful Session-Beans mit der Annotation @Inject injizieren, können die Session-Beans die typsichere Injektion mit Qualifikationsmerkmalen nutzen und ihren Lebenszyklus von ihrem CDI-Bereich verwalten lassen.
- Session-Beans kommen, anders als andere Managed Beans, für Abfangen und Dekoration infrage, selbst wenn sie nicht mit der Annotation "@Inject" abgerufen werden.
Für Web-Service-Komponenten:- Zum Entwickeln eines JAX-WS-Clients aus einer WSDL-Datei (Web Services Description Language) führen Sie die Schritte aus,
die im Artikel "JAX-WS-Client aus einer WSDL-Datei entwickeln" beschrieben sind.
Tipp: Verwenden Sie das Tool wsimport, um portierbare Java-Artefakte, einschließlich einer Serviceklasse, zu generieren.
- Wenn Sie die generierte Serviceklasse mit der Annotation @WebServiceRef in eine CDI-verwaltete Bean injizieren möchten, müssen Sie das Tool wsimport mit dem Argument -wsdllocation aufrufen. Damit ist die generierte Serviceklasse auf andere Systeme portierbar, weil die Serviceklasse die WSDL-Datei über einen relativen URI und keinen absoluten Pfad referenziert.
- Erzeugerfehler beheben.
- Schleifen in Erzeugermethoden. Wenn Sie eine Erzeugermethode verwenden, wird jeder Parameter als Injektionspunkt behandelt, in dem der Container die Abhängigkeit bereitstellt. Deshalb darf die Quelle von Kontextobjekten, die diese Parameterinjektionspunkte erfüllen, nicht dieselbe Klasse sein, die auch die Erzeugermethode enthält.
- Duplizieren von Erzeugermethoden (zwei @Produces-Annotationen mit denselben Qualifikationsmerkmalen in derselben Klasse). Wenn eine Klasse mehrere Erzeugerfelder hat, können diese Felder nicht denselben API-Typ und dieselbe Gruppe von Qualifikationsmerkmalen haben. Eine garantierte mehrdeutige Abhängigkeit könnte beispielsweise nicht injiziert werden.
- Beheben von Interceptor- und Decoratorfehlern.
Fehler vermeiden: Im Failoverszenario werden @Inject Validator und @Inject ValidatorFactory nicht unterstützt.gotcha
- Aktivieren Sie Interceptor, Interceptor für Decoratoraktiviertung und Decorator in der Datei beans.xml mittels @Priority. Sie gelten mit Ausnahme der EJB-Session-Beans alle nur für Kontextinstanzen von Beans. Kontextinstanzen sind Instanzen, die mit der Annotation @Inject oder durch Aufruf von Methoden in der Schnittstelle BeanManager abgerufen werden.
- Interceptors und Decorators in mehreren Bean-Implementierungsarchiven. Wenn die Interceptor und Decorators über die Datei beans.xml aktiviert werden, sind sie nur für das betreffende Archiv aktiviert. Werden die Interceptor und Decorator über @Priority aktiviert, sind sie für die gesamte Anwendung aktiviert.
- Verwenden Sie den Diagnosetrace, um zu bestimmen, warum ein Fehler aufgetreten ist.
- Trace für CDI durch Angabe von JCDI=all:com.ibm.ws.cdi*=all:org.jboss.weld*=all anfordern.
- Weiteren Trace für die Interaktion mit der Java EE-Injektion und dem EJB-Container durch Angabe von EJBContainer=all:MetaData=all:Injection=all anfordern.
- Weiteren Trace für die Interaktion mit webbezogenen Bereichen und Lebenszyklen durch Angabe von all:com.ibm.ws.wswebcontainer*=all anfordern.
- Vermeiden Sie umfangreiche Operationen in Standardkonstruktoren von Managed Beans.
Jeder Injektionspunkt für eine bestimmte Managed Bean erhält zusätzlich zu der eigentlichen Bean-Instanz, die bei der Verwendung des Proxys erstellt werden kann, einen neuen Client-Proxy, der den Standardkonstruktor der zugrunde liegenden Bean-Klasse aufruft. Da Abhängigkeitsinjektionen nach Abschluss des Konstruktors vorgenommen werden, können Konstruktoren außerdem keine injizierten Abhängigkeiten verwenden. In der Beschreibung des Lebenszyklus-Callbacks für die Annotation @PostConstruct können Sie nachlesen, wo die Logik für spätere Injektion platziert wird, die nur in der zugrunde liegenden Instanz ausgeführt wird.


http://www14.software.ibm.com/webapp/wsbroker/redirect?version=cord&product=was-nd-mp&topic=tweb_troubleshoot_cdi
Dateiname:tweb_troubleshoot_cdi.html