2015-09-24 38 views
0

更新问题:会话的上下文为null JBOSS 7.1

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

@Resource 
private SessionContext context; 

第一个EJB工作正常,但第二次(和任何以下)的会话上下文返回null。这是comlete代码:

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";  

} 
} 

有谁能够知道哪里出了问题。

回答

1

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

在你的情况下,每个EJB实例的生命周期都在容器的完全控制之下。

在您的代码中,由您创建的firstEJB实例由容器创建的另一个实例替换。 secondEJB实例仍然是您创建的实例(它缺少@EJB注释),因此它没有经过正确的生命周期管理,并且在处理注入后未完全构建它。

因此,一个简单的改变你的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()); 
    } 
} 

应该给你想要的结果。