繁体   English   中英

是否可以使用 CDI 注入 EJB 实现而不是其接口?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM