会话上下文为null JBOSS 7.1



更新问题:

我使用了JBOSS Develper Studio 8,JBOS服务器7.1基于jre 1.7。我有一个带有ejb和web项目的J2EE项目。在ejb项目中,我有两个相同的ejb 3.1在web项目中,只有一个servlet。这个servlet在第一个ejb中调用简单的测试方法,然后在第二个ejb中。测试方法中的第一件事是通过以下代码为资源会话上下文注入依赖项

@Resource
private SessionContext context;

第一个ejb工作正常,但第二个ejb(以及后面的任何ejb(为会话上下文返回null。这是完整的代码:

FirstServlet.java

@WebServlet("/FirstServlet")
public class FirstServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
@EJB
FirstEJB firstEJB = new FirstEJB();
SecondEJB secondEJB = new SecondEJB();
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    PrintWriter out = response.getWriter();
    out.println(firstEJB.helloFirst());
    out.println(secondEJB.helloSecond());   
}
}

FirstEJB.java

@Stateless
public class FirstEJB {
@Resource
private SessionContext contextFirst;
public String helloFirst(){
    System.err.println(contextFirst.toString());
    return "Hello from FirstEJB";    
 }
}

SecondEJB.java

@Stateless
public class SecondEJB {
@Resource
private SessionContext contextSecond;
public String helloSecond(){
   System.err.println(contextSecond.toString());    
   return "Hello from SecondEJB";    
 }
}

有人知道问题出在哪里吗。

使用注入的第一条规则是您的服务器(也称为"容器"(创建您注入的对象。

在您的案例中,每个EJB实例的生命周期都在容器的完全控制之下。

在您的代码中,您创建的firstEJB实例将被容器创建的另一个实例替换。secondEJB实例仍然是您创建的实例(它缺少@EJB注释(,因此它没有经过适当的生命周期管理,也没有完全构建并处理其@Resource注入。

因此,对servlet代码进行一个简单的更改:

@WebServlet("/FirstServlet")
public class FirstServlet extends HttpServlet {
    private static final long serialVersionUID = 1L;
    @EJB
    private FirstEJB firstEJB;
    @EJB
    private SecondEJB secondEJB;
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        PrintWriter out = response.getWriter();
        out.println(firstEJB.helloFirst());
        out.println(secondEJB.helloSecond());   
    }
}

应该会给你想要的结果。

相关内容

  • 没有找到相关文章

最新更新