将无状态EJB注入Servlet

时间:2013-03-27 18:26:02

标签: servlets ejb cdi inject

我正在尝试将无状态EJB注入servlet。 但它没有用。我明白了什么问题吗? 如果我在@WebService带注释的类中执行此操作,我可以毫无问题地使用注入的EJB。

我的EJB:

@Stateless
public class doSomethingService
{
  public void doSomething()
  {
    System.out.println("DO SOMETHING");
  }
}

我的Servlet:

@WebServlet("/testservlet")
public class test_servlet extends HttpServlet
{
  private static final long serialVersionUID = 1L;

  @Inject
  private doSomethingService injBean;

  public test_servlet() 
  {
    super();
    injBean.doSomething(); 
  }

这会导致NullPointerException。我试着做一个JNDI-Lookup,它运行得很好。事实是@Inject在Servlet中不起作用吗?

我正在使用Glassfish 3.1.2.2

1 个答案:

答案 0 :(得分:11)

您正尝试在构造函数中访问它。注入的依赖项在构造函数中不可用。如果尚未构造实例,则无法设置实例变量。你基本上期望它能像这样工作:

test_servlet servlet;
servlet.injBean = new doSomethingService();
servlet = new test_servlet();

显然情况并非如此。您最早可以在servlet的init()方法中访问它。它也可以在servlet的任何doXxx()方法中使用。

首先,替换

public test_servlet() {
    super();
    injBean.doSomething(); 
}

通过

@Override
public void init() {
    injBean.doSomething(); 
}

对具体问题

无关,我强烈建议您使用Java naming conventions。小写和下划线的类名称不符合标准Java命名约定,这会减慢经验丰富的Java开发人员对代码的解释。