5

我正在尝试将无状态 EJB 注入 servlet。但它不起作用。我理解错了吗?如果我在一个带@WebService注释的类中这样做,我可以毫无问题地使用注入的 EJB。

我的 EJB:

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

我的小服务程序:

@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

4

1 回答 1

11

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

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

显然不是这样。init()您可以通过servlet的方法最早访问它。它也仅在doXxx()servlet 的任何方法中可用。

开始,更换

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

经过

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

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

于 2013-03-27T18:31:54.850 回答