Jakarta ee 有状态会话Bean-状态丢失问题

Jakarta ee 有状态会话Bean-状态丢失问题,jakarta-ee,servlets,ejb,ejb-3.0,stateful-session-bean,Jakarta Ee,Servlets,Ejb,Ejb 3.0,Stateful Session Bean,我有一个servlet代码,它调用一个有状态会话bean代码并增加它的int值。但是,当我下次调用servlet及其对应的bean时,bean会丢失其状态,并再次从递增开始。有人能帮我解决这个问题吗。我的代码如下: public class CounterServlet extends HttpServlet { protected void processRequest(HttpServletRequest request, HttpServletResponse response)

我有一个servlet代码,它调用一个有状态会话bean代码并增加它的int值。但是,当我下次调用servlet及其对应的bean时,bean会丢失其状态,并再次从递增开始。有人能帮我解决这个问题吗。我的代码如下:

public class CounterServlet extends HttpServlet {

    protected void processRequest(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

       response.setContentType("text/html;charset=UTF-8");
       PrintWriter out = response.getWriter();

       try {
           Counter counter = new Counter() ;
           HttpSession clientSession = request.getSession(true);
           clientSession.setAttribute("myStatefulBean", counter);

           counter.increment() ;

           // go to a jsp page

       } catch (Exception e) {
           out.close();
       }
   }

}

在servlet中,您似乎没有试图记住第一个请求使用的是哪个SFSB。因此,下次收到请求时,您将创建一个新的SFSB,该SFSB没有状态

基本上,您需要做的是(伪代码)

也就是说:获取http请求并查看是否连接了会话。如果是,请检查是否已存在此会话的SFSB并使用它。否则,创建一个新的SFSB并将其粘贴到会话中


您还需要添加一些代码来清除旧的不再使用的SFSB。

在servlet中,您似乎没有试图记住第一个请求使用的是哪个SFSB。因此,下次收到请求时,您将创建一个新的SFSB,该SFSB没有状态

基本上,您需要做的是(伪代码)

也就是说:获取http请求并查看是否连接了会话。如果是,请检查是否已存在此会话的SFSB并使用它。否则,创建一个新的SFSB并将其粘贴到会话中


您还需要添加一些代码来清除旧的不再使用的SFSB。

在您的代码中,每次请求传入时,您都要创建新的
计数器,然后将新的
计数器保存到客户端会话中。因此,计数器总是从一开始就递增

在给客户一个新的
计数器之前,您应该检查客户是否已经有了
计数器。它将是以下内容:

HttpSession clientSession = request.getSession();
Counter counter = (Counter) clientSession.getAttribute("counter");

if (counter == null) {
    counter = new Counter();
    clientSession.setAttribute("counter", counter);
}

counter.increment();

此外,在本主题的名称中,您提到了有状态会话bean。但是,注入新的
计数器的方式看起来不像是注入有状态bean。在我看来,它就像一个普通的Java对象。

在您的代码中,每次请求传入时,您都在创建新的
计数器,然后将新的
计数器保存到客户端会话中。因此,计数器总是从一开始就递增

在给客户一个新的
计数器之前,您应该检查客户是否已经有了
计数器。它将是以下内容:

HttpSession clientSession = request.getSession();
Counter counter = (Counter) clientSession.getAttribute("counter");

if (counter == null) {
    counter = new Counter();
    clientSession.setAttribute("counter", counter);
}

counter.increment();

此外,在本主题的名称中,您提到了有状态会话bean。但是,注入新的
计数器的方式看起来不像是注入有状态bean。在我看来,它像一个普通的Java对象。

这不是EJB问题。您正在创建的是POJO而不是EJB。每次调用新函数都会启动一个新的objet。这不是Bean注入。

这不是EJB问题。您正在创建的是POJO而不是EJB。每次调用新函数都会启动一个新的objet。这不是豆子注射剂。

你能告诉我计数器的定义吗?如果它真的是一个EJB,您就不能用新的创建它。否则,在这个问题上提到EJB是没有意义的。您能给出计数器的定义吗?如果它真的是一个EJB,您就不能用新的创建它。否则,在这个问题上提到EJB是没有意义的。