【问题标题】:Injecting a stateless EJB into Servlet将无状态 EJB 注入 Servlet
【发布时间】:2023-03-31 13:37:01
【问题描述】:

我正在尝试将无状态 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

【问题讨论】:

    标签: servlets ejb cdi inject


    【解决方案1】:

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

    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 开发人员对代码的解释速度。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-04-25
      • 2017-10-26
      • 2015-01-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多