Sens de haricot mode de découverte annoté en CDI 1.1
Je suis de la migration d'une application Java EE 7 et voudrais CDI 1.1. Mais je ne comprends pas le sens de l' bean-discovery-mode="annotated"
. L'
CDI 1.1 spécification n'est pas très utile. Au moins je n'ai pas trouvé utile de paragraphe. Ai-je manquer?
Cet exemple fonctionne parfaitement avec bean-discovery-mode="all"
et injecte une instance de LoggingClass
:
public class LoggingClass {
public Logger logger = Logger.getLogger("ALOGGER");
}
@Test
public class MMLoggerProducerIT extends Arquillian {
@Inject private LoggingClass lc;
}
Mais si je change de bean-discovery-mode="all"
à bean-discovery-mode="annotated"
le conteneur n'est pas en mesure d'injecter un exemple dans le domaine lc
.
Comment puis-je faire pour annoter LoggingClass
à utiliser bean-discovery-mode="annotated"
correctement?
- Je suis seulement deviner, mais je pense que '@Nommée " ou "@ManagedBean' seraient des candidats?
- Nommé ne fera que révéler un haricot dans EL contexte, mais ne pas lui donner un champ d'application. ManagedBean est un JSF annotation, CDI moteur de l'ignorer.
Vous devez vous connecter pour publier un commentaire.
En pratique,
bean-discovery-mode="ALL"
tourne sur la numérisation de toutes les classes dans une archive. Ceci est appelé un "explicite archive".Omettant
beans.xml
, ou la mise enbean-discovery-mode="ANNOTATED"
, rend l'archive implicite de l'archive. Dans ce cas, le conteneur d'analyse pour les haricots avec annoté portée types.C'est ce qui explique pourquoi
LoggingClass
n'est pas injecté lorsque vous définissezbean-discovery-mode="ANNOTATED"
. Comme indiqué dans le Java EE 7 Tutoriel:Edit: donc, juste pour être tout à fait clair, vous devez ajouter un champ de type de
LoggingClass
. Donc quelque chose comme ceci:En Java EE 7 et CDI 1.1, nous avons supprimé l'obligation d'inclure le
beans.xml
descripteur de déploiement pour activer CDI pour une archive, apportant CDI 1.1, en ligne avec la plupart des autres Java EE Api où les descripteurs de déploiement sont en option. Il a aussi supprimé le fichier binaire on/off de la nature de l', y comprisbeans.xml
ou pas. Vous pouvez contrôler quels fichiers sont analysés par le conteneur avec les paramètresbean-discovery-mode
.Voir le JavaEE tutoriel sur les emballages des applications CDI ici:
http://docs.oracle.com/javaee/7/tutorial/cdi-adv001.htm#CACDCFDE
beans.xml
, comment sont les Intercepteurs et les Décorateurs enregistré et a ordonné? Est-il possible?@Interceptors
et@Priority
, tel que décrit dans la section 54.2.5 ici.Lors de l'utilisation de
bean-discovery-mode="annotated"
seulement les classes avec un bean définition d'annotation sont découverts. Toutes les autres classes sont ignorés. Tout type de portée est un haricot définition de l'annotation. Si un type de portée est déclaré sur une classe d'haricot, puis la classe d'haricot est dit d'avoir un haricot définition d'annotation [spec]. L'1.1 spécification n'est pas complètement clair. Seules les classes avec un@NormalScope
portée ou@Dependent
pseudo portée sont découverts,@javax.inject.Singleton
et tous les autres@Scope
(pseudo) des étendues sont ignorés.Noter que la définition d'un "bean définition de l'annotation" changé en CDI 1.2 et est maintenant très bien défini:
Je suis également d'accord avec le formulaire de réponse @rmuller. Mais je tiens à souligner qu'il y a encore un comportement différent sur les serveurs d'applications Payara et Wildfly.
Voir l'exemple suivant avec un normal de ne pas l'étendue de la classe, mais ayant un @EJB injection:
Si vous fournissez un beans.xml fichier:
Payara 4.1 traitera de la classe SomeClass PAS en tant que bean CDI et de ne PAS injecter le service EJB.
C'est clair pour moi qu'il se comporte comme indiqué dans le cahier des charges.
Mais Wildfly 10 traite de la classe comme un bean CDI et injecte le service EJB qui n'est pas prévu. Pour obtenir ce travail à la beans.xml fichier devrait ressembler à ceci:
Il est étonnant que la plupart des serveurs d'application sont différents dans leur comportement.