[英]Is it possible to inject EJB implementation and not its interface using CDI?
我的配置是:Wildfly 8.2.0,Weld
是否可以在 Bean 中注入而不是在 CDI 的接口中注入?
@Stateless
class Bean implements IBean {
...
}
interface IBean {
...
}
@SessionScoped
class Scoped {
@Inject
Bean bean; //Fail
@Inject
IBean iBean; //OK
}
编辑:
更多信息在我之前的问题中: Stateless EJB implements interface injection failed
是的,你可以,但是当 EJB 注入业务视图时,你公开的唯一业务视图是@Local
视图,它是你实现接口时的默认视图(在你的情况下, IBean
是本地业务接口)。 所以,如果你想注入 bean 本身,你需要告诉容器你正在使用无接口视图。
在您的示例中,如果您仍想实现您的接口并注入Bean
,您应该使用@LocalBean
注释,这意味着该 bean 公开了一个无接口视图:
@Stateless
@LocalBean // <-- no-interface view
class Bean implements IBean {
...
}
interface IBean {
....
}
@SessionScoped
class Scoped {
@Inject
Bean bean; //Should be OK
}
或者,如果您不想实现任何接口,则该 bean 默认定义一个无接口视图:
@Stateless
class Bean {
...
}
@SessionScoped
class Scoped {
@Inject
Bean bean; //OK
}
看起来你在之前的问题中得到了一个不清楚的答案,实际上所有这个问题都是对那个问题的跟进。
一般来说,CDI 允许您为 CDI 管理的 bean 注入接口和实现。 EJB 不是这种情况。 当 EJB 实现一个接口时,它就变成了它的业务接口。 只有在那里声明的方法是有效的。 实际上,您的Bean
类仅定义了这些方法的工作方式,实际上并不作为运行时中的 bean 存在。
所以不,当使用 EJB 时,您不能注入实现,只能注入接口。 如果您真的想这样做,我会远离 EJB。
您可能不愿意使用该接口来注入 EJB 的可能原因之一可能是您可能有许多 EJB 实现该接口,并且您的 EJB 容器可能抱怨它无法解决特定 EJB 必须注入的歧义。在给定的上下文中注入。 如果是这种情况,您可以使用javax.inject.Named
注释轻松指定实现公共接口的具体 EJB 类的名称,如下所示:
@SessionScoped
class Scoped {
@Named("Bean")
IBean iBean;
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.