将无状态EJB注入Servlet [英] Injecting a stateless EJB into Servlet

查看:133
本文介绍了将无状态EJB注入Servlet的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我试图将无状态的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 在Servlets中不起作用?



我使用Glassfish 3.1.2.2

解决方案

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

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

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



要开始,请替换



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

by

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






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


I'm trying to inject a stateless EJB into servlet. But it is not working. Did I understand something wrong? If I do this in a @WebService annotated class, I can use the injected EJB without problems.

My EJB:

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

My 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(); 
  }

This causes a NullPointerException. I tried to do a JNDI-Lookup and it worked very well. Is it a fact that @Inject does not work in Servlets?

Im using Glassfish 3.1.2.2

解决方案

You're trying to access it in the constructor. The injected dependencies are not available in the constructor. It's not possible to set an instance variable if the instance is not constructed yet. You're basically expecting it to work like this:

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

This is clearly not the case. You can access it at earliest in init() method of the servlet. It's also just available in any of the doXxx() methods of the servlet.

To start, replace

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

by

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


Unrelated to the concrete problem, I strongly recommend to work on your Java naming conventions. The lowercased and underscored class names are not conform standard Java naming conventions, which slowdowns the interpreting of the code by seasoned Java developers.

这篇关于将无状态EJB注入Servlet的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆