Mar*_*son 6 dependency-injection cdi managed-bean glassfish-4 java-ee-7
鉴于我们部署的存档是一个"隐式bean存档"(见下文),@javax.inject.Inject用于@javax.annotation.ManagedBean在WildFly 8.1.0中注入另一个托管bean工作,但它不适用于GlassFish 4.0.1-b08或GlassFish 4.1- B13.GlassFish崩溃了这条消息:
WELD-001408:类型的不满意依赖...
我是否误解了以下概述的规格或GlassFish有错误吗?
CDI 1.1(JSR-346)第12.1节"Bean Archives"说:
显式bean归档文件是包含beans.xml文件[...]的归档文件.隐式bean归档是包含一个或多个bean类的任何其他归档,其中bean定义了注释[..].
如果那时,我的存档没有beans.xml描述符文件,我仍然可以使用具有"bean定义注释"的bean.问题是,什么是定义注释的bean?
CDI规范第2.5节"Bean定义注释"说:
任何范围类型都是定义注释的bean.
所以这很清楚,根据CDI规范的这一部分,它就是全部.如果我部署了一个没有beans.xml描述符文件的存档,那么只要它们具有显式声明的范围,我就可以@Inject bean,@javax.enterprise.context.RequestScoped例如.它适用于WildFly和GlassFish.然而..
Java EE技术堆栈中的所有规范必须遵守的子集规范Managed Beans(JSR-316)具有"基本模型",其中@javax.annotation.ManagedBean定义了托管bean.托管bean规范并未说明@ManagedBean使bean成为注入点(即字段或参数)的合理注入目标.规范确实说bean"可以在Java EE应用程序中的任何地方使用"(第MB.1.2节"为什么管理豆类?"),在我耳边听起来它们应该是可注射的.
Java EE 7规范(JSR-342)在EE.5.24"支持依赖注入"一节中有这个说法:
容器必须支持使用javax.inject.Inject注释注释的注入点,仅限于CDI规定的范围.根据CDI规范,托管bean支持依赖注入.
目前有三种方法可以使类成为托管bean:
- 作为EJB会话bean组件.
- 使用ManagedBean批注进行批注.
- 满足CDI规范中描述的条件.
满足至少一个这些条件的类将有资格获得完全依赖注入支持,如CDI规范中所述.
你去了:@ManagedBean有"完全依赖注入支持".不是一半或只是一点点的支持.然而,我并不确定"依赖注入支持"究竟是什么.但我认为后面的段落描述得足够好:
表EE.5-1中列出的满足上述第三个条件但不满足第一个条件和第二个条件的组件类,如果使用CDI bean定义注释注释或包含在bean中,也可以用作CDI托管bean已启用CDI的存档.但是,如果它们用作CDI托管bean(例如,注入其他托管类),则由CDI管理的实例可能不是由Java EE容器管理的实例.
基本上,本段所说的是第二个条件是可以注入其他托管类的CDI托管bean(因为异常bean"也可以").
伞规范和托管bean规范都使得CDI规范有了明确的说法.
该@ManagedBean注释仅在CDI规范中提到的两次,这两个发生在其中提到的一个CDI扩展可以观察到生命周期CDI事件第11章.第11.5.7节是命中之一并定义ProcessInjectionPoint事件.托管bean可能会使用依赖注入 - 这并不奇怪.但是,第11.5.8节定义了一个ProcessInjectionTarget事件.以下是规范对ProcessInjectionTarget事件的说法:
容器必须为每个支持注入的Java EE组件类触发事件,该注入可以由容器在运行时实例化,包括使用@ManagedBean,EJB会话或消息驱动的bean,bean,拦截器或装饰器声明的每个托管bean.
这句话无疑表示a @ManagedBean可以用作注入点的目标而不添加范围类型的概念(@Dependent总是默认的).
如前所述,从WildFly中的隐式bean归档注入@ManagedBean,据我所知,这是刚刚引用的所有Java EE规范所要求的.所以我认为GlassFish有一个bug.但CDI规范从未在第2.5节"Bean定义注释"中对@ManagedBean说一句话,而且一如既往,在阅读重叠的Java EE规范时,我是一个神经残骸,所以我想在我去之前提出一个问题" GlassFish团队的关键"错误".
提起了一个GlassFish错误:https://java.net/jira/browse/GLASSFISH-21169.
这不是一个完整的答案,因为当我们试图将所有规范放在一起并理解时,不可避免地会出现混乱。我只是想说,CDI 1.2已经澄清了 Bean 定义注释到底是什么(请参阅“2.5.1. Bean 定义注释”一节)。CDI 1.2给出一个列表:
bean 定义注释集包含:
- @ApplicationScoped、@SessionScoped、@ConversationScoped 和 @RequestScoped 注释,
- 所有其他正常范围类型,
- @Interceptor 和 @Decorator 注解,
- 所有构造型注释(即用@Stereotype注释的注释),
- 和@Dependent范围注释。
应该补充的是,定义“正常作用域类型”(第二个要点)的是注释为@NormalScope 的自定义作用域。
| 归档时间: |
|
| 查看次数: |
1535 次 |
| 最近记录: |