JBoss 6:将EJB注入到servlet中

3

大家好,

每当新版本的JBoss推出时,我总是很苦恼地不得不重新学习和浪费时间。

我有一个无状态的EJB,在JNDI空间中被发现和声明:

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

我需要在一个war包中的servlet中使用这个EJB,而该war包又是包含该EJB的EAR的一部分。我希望使用注入来完成它。
当我使用最直观的符号时:
@EJB
private UserManager userManager;

我在 JBoss 日志中发现了一个异常。

当我使用更华丽的陈述方式,例如:

@EJB( mappedName = "UserManager" )
private UserManager userManager;

或者

@EJB( mappedName = "DTalk/UserManager/local" ) // EAR is called DTalk
private UserManager userManager;

我在jboss中没有收到任何注入错误,但被注入的bean为空。

这让人十分恼火,浪费了大量时间,让我开始怀疑为什么我不放弃Eclipse / JBoss工具并转而选择NetBeans和GlsssFish。

如果有任何见解,请告知。

谢谢。


1
你似乎有许多需要澄清的误解。你不愿重新学习的“新东西”与 JBoss 无关,它们反映了新的 Java 规范。理论上,GlassFish 的新版本将更新以支持与 JBoss 相同的新 JSR。没有人强迫你使用新版本的 JBoss,对吧?此外,你不必将 Eclipse/JBoss 或 NetBeans/GlassFish 作为一对使用,应用服务器与任何主要的 IDE 都可以完全互操作。 - Matt Ball
嗨Matt,谢谢你的来信。既然我发了一篇不太有帮助的牢骚文,我理应得到一种同样没有帮助的回应。然而,关于应用服务器与主要IDE能互操作这一点,你的说法或许有些理想化。它们也许可以被制作成互操作的,如果你喜欢那种东西,或者说把自己的耳朵钉在墙上。话虽如此,你有没有一个回答给我,还是只有个对牢骚的回应呢? - Raj
使用最小的“@EJB private UserManager userManager;”注入时,您会得到什么异常? - Matt Ball
嗨,马特,我在使用Servlet中的bean类时应该引用本地接口。再次感谢您的回复。 - Raj
1个回答

5
你试图注入(代理)bean实例本身,而不是它的接口。
但根据您展示的部署日志,您仅通过其(本地)接口声明了将bean绑定到JNDI中。为使注入发生,请将你正在注入的变量声明为接口。
@EJB
private UserManagerLocal userManager;

或者声明为您的bean创建一个no-interface视图:

@Stateless
@LocalBean
public class UserManager implements UserManagerLocal {
    ...
}

之后你可以像之前一样声明变量:
@EJB
private UserManager userManager;

Arjan,非常感谢您提供准确直接的答案。您找到了根本原因:我引用的是bean类而不是接口。同时,感谢您让我意识到EJB3.1无接口视图。我也会去查看一下这个。 - Raj

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接