2017-05-30 1 views
0

J'ai une application d'entreprise avec 5 modules Maven (common-Jar, EJB, WEB, EAR, GAR)
le fichier beans.xml est sous le Web module\webapp\WEB-INF et i utiliser ce code pour lister tous les grains découverts:
bon endroit pour mettre toutes les annotations et les haricots CDI dans les modules multi-projets

Set<Bean<?>> beans = beanManager.getBeans(Object.class, new AnnotationLiteral<Any>() { 
}); 
for (Bean<?> bean : beans) { 
    System.out.println(bean.getBeanClass().getName()); 
} 

mais certains de mes classes (classes d'entité avec @Stateless annotation) n'a pas été découvert. et je ne peux pas les injecter dans un champ. (Erreur: unsatisfied dependency injection point)
Question 1: Existe-t-il une exception ou une limitation pour les haricots découverts?


** Je crée un qualificateur pour effacer l'état ambigu, mais ils ne peuvent pas être utilisés sous une forme simple comme @MyQualifier et il doit être utilisé uniquement par son nom de référence complet comme @com.test.packagename.MyQualifier.
Question 2: Quel est le bon endroit pour placer toutes les annotations et les beans CDI dans des projets multi-modules?

Répondre

0

Question 1: is there any Exception or limitation for discovered beans ?

Oui, beaucoup d'entre eux en fait. Bienvenue dans Java EE. Toute cette chose est mandatée par Java EE "umbrella" spec (JSR 342) à laquelle CDI spec doit se conformer. Par exemple, WAR peut voir dans le jar d'EJB mais pas vice versa, cela se traduira par l'injection de bean. En outre. La spécification de parapluie d'EE n'est pas exactement claire sur beaucoup de choses ainsi il arrive que différent AS (Wildfly, GlassFish, ...) puisse différer légèrement dans leur comportement.

Question 2: what is the right place for putting all annotations and CDI beans in multi modules projects ?

Encore une fois pas une chose simple à répondre; En raison des règles de visibilité, vous devez décider si vous vous souciez des déploiements qui verront quels beans. Vous pouvez ensuite utiliser différentes variantes du même type de bean de base dans différentes WAR et ainsi de suite. Si vous voulez que tout soit accessible à partir de toutes les archives déployées, alors EAR/lib est probablement l'endroit (NOTE: n'implique pas les beans partagés).

La plupart des projets choisissent d'affiner cela et de mettre le bean dans l'archive qui en aura besoin. Dans le cas où d'autres archives en auraient besoin, extrayez-le (selon les règles de visibilité) dans une archive visible de tous les endroits requis (EAR/lib étant le dernier recours).

Notez également que vous aurez probablement besoin d'avoir beans.xml dans plusieurs archives si vous voulez avoir CDI a permis là-bas (pas tous, mais pour simplifier, si vous le mettez là, il sera activé que).

Last but not least, votre code pour récupérer tous les haricots peuvent ne pas fonctionner (comme vous attendez) en raison des règles de visibilité - la BeanManager est limitée à la seule série accessible de haricots.

+0

Merci un million de bro, c'était très utile. –

+0

@MohsenSabbaghi ​​heureux que je pourrais aider. Si cela répond à la question, veuillez indiquer que ma réponse est correcte (ou peu importe comment ils l'appellent) afin qu'elle ne reste pas ouverte. – Siliarus