2015-09-24 114 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()); 
    } 
} 

應該給你想要的結果。