2012-04-26 9 views
1

私はEJBを初めて使用しています。 EARアプリケーションにステートフルBeanが必要です。私は、EJBモジュールに簡単なステートフルセッションBeanを作成しました:ステートフルEJBの問題 - すべてのユーザーに対して1つのセッションを維持します

@Stateful 
public class Test { 

    public Test() { 
    } 

    private int i; 

    @PostConstruct 
    public void initialize() { 
     i = 0; 
    } 

    public int getI() { 
     return i++; 
    } 
} 

そして私は、戦争のモジュールでサーブレットからそれを呼び出す:私はそれを実行すると

public class TestServlet extends HttpServlet { 

    @EJB 
    Test test; 

    protected void processRequest(HttpServletRequest request, HttpServletResponse response) 
      throws ServletException, IOException { 
     response.setContentType("text/html;charset=UTF-8"); 
     PrintWriter out = response.getWriter(); 

     HttpSession session = request.getSession(true); 

     out.println("<html>"); 
     out.println("<head>"); 
     out.println("<title></title>");    
     out.println("</head>"); 
     out.println("<body>"); 
     out.println("<h1>" + test.getI() + "</h1>"); 
     out.println("</body>"); 
     out.println("</html>");   
     out.close(); 
    } 
... 
} 

、数はそれぞれのリフレッシュと大きくなりますブラウザ。

0、1、2、...

しかし、私は他のブラウザでそれを実行すると、番号は0から開始しますが、以前のブラウザからのセッションを継続しません。シングルトンのように振る舞います。

3、4、5、...

はなぜ、Beanの新しいインスタンスが作成されませんでしたか?セッションBeanをwarモジュールに入れようとしましたが、SessionScopedで注釈を付けましたが、結果は同じです。

httpセッションごとにステートフルBeanの新しいインスタンスを作成できますか?

答えて

4

すべての要求を処理するために単一のサーブレットが作成されます。 1つのステートフルセッションBeanのインスタンスをサーブレットに挿入しているので、すべての要求で同じステートフルセッションBeanが使用されます。ステートフルセッションBeanを注入することはめったに役に立ちません。あなたがCDIを持っている場合、あなたは@SessionScopedとしてあなたのステートフルセッションBeanをマークし、むしろ、注射のために@Injectを使用することができ、また

// Declare the reference without injection... 
@EJB(name="ejb/test" beanInterface=Test.class) 
public class TestServlet extends HttpServlet { 
    protected void processRequest(HttpServletRequest request, HttpServletResponse response) 
      throws ServletException, IOException { 
     response.setContentType("text/html;charset=UTF-8"); 
     PrintWriter out = response.getWriter(); 

     HttpSession session = request.getSession(true); 
     Test bean = session.getAttribute(BEAN); 
     if (bean == null) { 
      try { 
       // ...and then create an instance by looking it up from java:comp/env 
       bean = (Test)new InitialContext().lookup("java:comp/env/ejb/test"); 
      } catch (NamingException ex) { ... } 
      session.setAttribute(BEAN, bean); 
     } 

     ... 
    } 
} 

あなたはステートフルセッションBeanごとのHttpSessionのインスタンスを作成する必要があります@EJBより。

+1

ありがとうございました。 SessionScopedを試しましたが、うまくいきませんでした。私の間違いは、EJBを使用してインスタンスをフェッチしたことですが、それはInjectで行う必要があります。だから、私は幸せにSessionScopedステートフルを使用していて、注射で注入しています。 – ziri

+0

ああ、はい、私は@インジェクションについて言及するのを忘れていました。感謝の答えを更新しました。 –

関連する問題