dependency-injection之JBoss 6 : Injecting EJB into servlet

jackei 阅读:26 2024-11-24 20:56:43 评论:0

各位,

每次新版本的 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; 


标签:Servlet
声明

1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。

关注我们

一个IT知识分享的公众号