Dépannage - Context and Dependency Injection
Troubleshoot errors that are related to Contexts and Dependency Injection (CDI) for the Java™ Platform, Enterprise Edition (Java EE) applications.
Avant de commencer
Pourquoi et quand exécuter cette tâche
Lorsque vous utilisez une implémentation CDI, vous pouvez rencontrer des erreurs lors du déploiement d'applications ou lorsque CDI interagit avec d'autres composants Java EE. You might also experience problems with producers, interceptors, and decorators or diagnostic trace. Cette tâche permet de corriger les erreurs pouvant survenir.
Procédure
- Corrigez les problèmes de déploiement d'application. Au moment du déploiement de
l'application, le conteneur doit valider chaque point d'injection
dans l'application. Il est satisfait par une source uniquement de la dépendance.
Eviter les incidents: Hot deployment is not supported in CDI applications. To make the update available, you must restart the application.gotcha
- Résolvez la dépendance ambigüe.
An ambiguous dependency, or javax.enterprise.inject.AmbiguousResolutionException exception, occurs when the container resolves an injection points type and qualifiers to more than one managed bean, producer method, or producer field.
The exception reveals the injection point that was being processed, and the candidate beans that remained at the end of the type-safe resolution process. Tout ce qui dépasse un bean unique est une erreur d'application :
Pour résoudre l'erreur, effectuez l'une des opérations suivantes :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()]
- Dissipez l'ambiguité du point d'injection en ajoutant un qualificateur au point d'injection et, si nécessaire, une source de la dépendance.
- If necessary, annotate one of the sources of contextual instances with @Alternative or @Specializes, if some of the dependencies should not be considered for injection.
- Résolvez une dépendance ne pouvant pas être satisfaite. An unsatisfiable dependency, or javax.enterprise.inject.UnsatisfiedResolutionException, occurs when there is no corresponding source for objects matching an injection point in the application. Le type d'API de la zone, avec l'ensemble facultatif d'annotations de qualificateur, indiquent à l'ensemble de beans valides de satisfaire la dépendance. Les causes d'une dépendance ne pouvant pas être satisfaite sont les suivantes :
- Il n'existe pas de bean géré affectable au type de point d'injection.
- Il n'existe pas de méthode de producteur de tout bean géré dont le type de retour est affectable au point d'injection.
- Il n'existe pas de zone de producteur de tout bean géré dont le type est affectable au point d'injection.
- Un des scénarios mentionnés ci-dessus est valide, mais les annotations de qualificateur sur le point d'injection ne sont pas présents sur le bean ou producteur.
Remarque : Résolvez l'erreur en rendant une dépendance avec les qualificateurs et type d'API disponible en introduisant un nouveau bean, supprimant les qualificateurs, ou ajoutant les méthodes ou zones de producteurs. La section 5.2 de la rubrique Contexts and Dependency Injection for Java specification décrit la résolution sécurisée en détails.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()]
- Résolvez la passivation des dépendances de portée. La passivation est l'acte de déplacer un objet en veille qui est en attente dans le stockage auxiliaire de la mémoire. A passivating scope, such as the built-in scopes, @SessionScoped and @ConversationScoped, requires that any bean that uses the scope be passivation-capable. Un bean est capable de passivation s'il est un bean de session avec état ou tout autre bean géré à la fois sérialisable et sans décorateurs ni intercepteurs non sérialisables. Les causes des dépendances de la portée de passivation incluent les suivantes :
- Changing the scope of an existing bean to a passivating scope, such as @SessionScoped or @ConversationScoped.
- Ajoutez des décorateurs ou intercepteurs non sérialisables à un bean capable de passivation.
- Assurez-vous que le bean en question est sérialisable.
- Assurez-vous que tous les décorateurs et intercepteurs du bean sont sérialisables.
- Modifiez la portée du bean géré sur une portée non passivative.
- Résolvez la dépendance ambigüe.
- Dépannez les erreurs résultant
de CDI interagissant avec d'autres composants
Java EE.
The @Inject annotation provides an additional type of Java EE dependency injection. Sa relation à l'injection définie dans Java EE 5 est la suivante :
- Une injection utilisant des annotations autres que l'annotation @Inject se comporte comme dans les éditions précédentes. Seules les dépendances injectées utilisant l'annotation @Inject sont des instances contextuelles telles que définies par Contexts and Dependency Injection for Java (JSR299).
- Use producer fields and producer methods to provide limited CDI features (such as type-safe injection) of Java EE dependencies obtained using the @Resource, @PersistenceContext, @PersistenceUnit, and @WebServiceRef annotations.
Si vous ne pouvez pas obtenir de valeur pour une référence EL (Expression Language) à un bean géré pour les composants JavaServer Pages (JSP) et JavaServer Faces (JSF), vous pouvez envisager les approches suivantes :- Ensure that the bean class is annotated by using the @Named annotation or is annotated with a stereotype that defines the @Named annotation.
- Ensure that the EL expression matches the class name of the bean class after converting the first character to lowercase. When you use the @Named annotation qualifier with a value member (for example, @Named("myName")), this specifies the bean name (a special case qualifier) but does not change the EL name of that bean.
Pour les composants EJB :- You can inject session beans with the @Inject and @EJB annotations. When you inject stateful session beans with the @Inject annotation, the session beans can take advantage of type-safe injection using qualifiers, and can have their life cycle managed by their CDI scope.
- Les beans de session ne sont pas admissibles pour l'interception et la décoration même lorsqu'ils ne sont pas obtenus avec l'annotation @Inject, contrairement aux autres beans gérés.
Pour les composants de service Web :- Pour développer un client
JAX-WS à partir d'un fichier WSDL (Web Services Description Language),
suivez les étapes de la rubrique sur le développement d'un client
JAX-WS à partir d'un fichier WSDL.Conseil : Use the wsimport tool to generate portable Java artifacts, including a service class.
- If you want to inject the generated service class into a CDI-managed bean, using the @WebServiceRef annotation, you must invoke the wsimport tool using the -wsdllocation argument. Après quoi, la classe de service généré est portable aux autres systèmes car la classe de service référence le fichier WSDL avec une URI relative, au lieu d'un chemin absolu.
- Résolvez les erreurs de producteur.
- Boucle dans les méthodes de producteur. Lorsque vous utilisez une méthode de producteur, chaque paramètre est traité en point d'injection dans lequel le conteneur fournit la dépendance. Par conséquent, la source des objets contextuels satisfaisant ces points d'injection de paramètre ne doivent pas être de la même classe que celle qui contient la méthode de producteur.
- Duplicate producer methods (two @Produces annotations with same qualifiers in the same class). Si une classe a plusieurs zones de producteurs, ces zones ne peuvent pas avoir le même type d'API et un ensemble identique de qualificateurs, car une dépendance ambigüe n'est pas injectable.
- Résolvez les erreurs de décorateur et intercepteur.
Eviter les incidents: In the failover scenario, @Inject Validator and @Inject ValidatorFactory is not supported.gotcha
- Enable interceptor, decorator enablement interceptors, and decorators in the beans.xml file or via @Priority. Tous les beans de session sauf EJB s'appliquent uniquement aux instances contextuelles de beans. Contextual instances are instances obtained by using the @Inject annotation or by calling methods on the BeanManager interface.
- Intercepteurs et décorateurs dans plusieurs archives de déploiement de bean (BDA). If the interceptors or decorators are enabled via the beans.xml file, these interceptors or decorators are enabled for that archive only. If the interceptors or decorators are enabled via @Priority, the interceptors or decorators are enabled for the whole application.
- Utilisez la trace de diagnostic pour aider à déterminer pourquoi une erreur est survenue.
- Obtain a trace for CDI by specifying JCDI=all:com.ibm.ws.cdi*=all:org.jboss.weld*=all.
- Obtain an additional trace for interacting with Java EE injection and the EJB container by specifying EJBContainer=all:MetaData=all:Injection=all.
- Obtain an additional trace for interacting with web-related scopes and lifecycles by specifying all:com.ibm.ws.wswebcontainer*=all.
- Evitez les opérations lourdes dans les constructeurs par défaut de beans gérés.
Chaque point d'injection pour un bean géré donné reçoit un nouveau proxy client qui appelle le constructeur par défaut de la classe de bean sous-jacente, en plus de l'instance de bean réelle pouvant être créée lors de l'utilisation du proxy. En outre, étant donné que les injections de dépendance se produisent à la fin de la construction, les constructeurs ne peuvent pas utiliser de dépendances injectées. See the @PostConstruct annotation lifecycle callback for a place to put post-injection logic that runs in the underlying instance only.


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