JBoss 6:将EJB注入servlet

时间:2011-07-26 17:17:08

标签: dependency-injection ejb-3.0 jboss6.x

民间,

每次新版本的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的一部分。我想用注射剂来做。

当我使用最直观的表示法时:

@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是null。

这令人抓狂,浪费时间,让我怀疑为什么我不会将Eclipse / jboss工具专营权转让给NetBeans和GlsssFish。

任何见解都表示赞赏。

感谢。

1 个答案:

答案 0 :(得分:5)

您正在尝试注入(代理)bean实例本身,而不是其接口。

然而,根据您显示的部署日志记录,您只通过其(本地)接口声明了bean在JNDI中的限制。为了使注入发生,你应该将你注入的变量声明为接口:

@EJB
private UserManagerLocal userManager;

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

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

之后您可以像之前那样声明变量:

@EJB
private UserManager userManager;