我有一个带有5个maven模块的企业应用程序(常见的Jar,EJB,WEB,EAR,GAR)
beans.xml
文件位于Web module\webapp\WEB-INF
下,我使用此代码列出所有已发现的bean:
Set<Bean<?>> beans = beanManager.getBeans(Object.class, new AnnotationLiteral<Any>() {
});
for (Bean<?> bean : beans) {
System.out.println(bean.getBeanClass().getName());
}
但是我的一些类(带有@Stateless
注释的实体类)尚未被发现。我不能把它们注射到田地里。(错误:unsatisfied dependency injection point
)
问题1:发现的bean有任何异常或限制吗?
@MyQualifier
之类的简单形式使用,并且必须仅使用它的完整引用名称@com.test.packagename.MyQualifier
。
答案 0 :(得分:1)
问题1:对发现的bean有任何异常或限制吗?
是的,其实很多。欢迎来到Java EE。整个事情是由CDI规范必须符合的Java EE“伞”规范(JSR 342)强制执行的。例如,WAR可以看到EJB jar,但反之亦然,因此这将转化为bean注入。此外。 EE保护规范在许多方面并不十分清楚,因此不同的AS(Wildfly,GlassFish,......)的行为可能略有不同。
问题2:在多模块项目中放置所有注释和CDI bean的正确位置是什么?
再一次回答并不简单;由于可见性规则,您需要决定是否关心哪些部署将查看哪些bean。然后,您可以在不同的WAR中使用相同基本bean类型的不同替代品,依此类推。如果您希望所有部署的归档都可以访问它,那么EAR/lib
可能就是这个地方(注意:并不意味着共享bean)。
大多数项目选择细化这个并将bean放入需要它的存档中。如果更多档案需要它们,请将其(根据可见性规则)提取到可见所有需求地点的档案(EAR/lib
是最后的手段)。
另请注意,如果您希望在其中启用CDI,则可能需要 beans.xml
多个档案(不是全部,而是为了简化,如果您放置它在那里,它肯定会启用。)
最后但并非最不重要,由于可见性规则,检索所有bean的代码可能无效(正如您所期望的那样) - BeanManager
仅限于可访问的一组豆。