dependency-injection之JBoss 6 : Injecting EJB into servlet
各位,
每次新版本的 JBoss 推出时,我都不得不重新学习并浪费时间在这些东西上,这让我非常恼火。
我有一个在 JNDI 空间中发现和声明的无状态 EJB:
10:01:53,044 INFO [org.jboss.ejb3.proxy.impl.jndiregistrar.JndiSessionRegistrarBase] Binding the following Entries in Global JNDI:
DTalk/UserManager/local - EJB3.x Default Local Business Interface
DTalk/UserManager/local-com.doctalk.ejb.UserManagerLocal - EJB3.x Local Business Interface
我需要在一个 servlet 中使用这个 EJB,它是 war 的一部分, war 是包含 EJB 的 EAR 的一部分。我想使用注入(inject)来完成。
当我使用最直观的符号时:
@EJB
private UserManager userManager;
我在 JBoss 日志中遇到异常。
当我使用更华丽的符号时,例如:
@EJB( mappedName = "UserManager" )
private UserManager userManager;
或者
@EJB( mappedName = "DTalk/UserManager/local" ) // EAR is called DTalk
private UserManager userManager;
我在 jboss 中没有注入(inject)错误,但是注入(inject)的 bean 是空的。
这太让人抓狂了,浪费了大量时间,让我质疑为什么我不放弃 Eclipse/jboss 工具专营权,转而支持 NetBeans 和 GlsssFish。
任何见解表示赞赏。
谢谢。
请您参考如下方法:
您正在尝试注入(inject)(代理)bean 实例本身,而不是它的接口(interface)。
然而,根据您显示的部署日志记录,您仅通过其(本地)接口(interface)在 JNDI 中声明了要绑定(bind)的 bean。为了使注入(inject)发生,您应该将要注入(inject)的变量声明为接口(interface):
@EJB
private UserManagerLocal userManager;
或者声明应该为您的 bean 创建一个 no-interface
View :
@Stateless
@LocalBean
public class UserManager implements UserManagerLocal {
...
}
之后您可以像之前那样声明变量:
@EJB
private UserManager userManager;
1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。