为什么我的无状态会话bean充当有状态的?

问题描述 投票:0回答:2

我已经写了有状态的会话bean:

@Stateful
public class SessionBean {
List<Integer> list = new ArrayList<>();
public void addItem(int s) {
    list.add(s);
}
public int getItemsCount() {
    return list.size();
}
}

并在我的servlet中使用它:

@WebServlet("/add")
public class AddServlet extends HttpServlet {
@Inject
SessionBean sessionBean;
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    int i = sessionBean.getItemsCount();
    resp.getWriter().write(i + " ");
    sessionBean.addItem(i + 1);
}
}

它按预期工作,列表保存状态,我可以在下一个请求中使用它。但是,如果我要在@Stateless上更改@Stateful,我希望不存储Bean的状态,并获取每个请求的清除列表,但它始终会保存上一个请求的状态并显示新的数字。那么,无状态和有状态之间有什么区别?怎么看?如我所见,它们的工作原理相同。我想看看示例,该示例将显示类似的内容-在这里我们使用有状态并保存状态,在这里我们更改无状态,并且工作方式有所不同而不保存状态。请告诉我区别。

java ejb stateless stateful
2个回答
1
投票

但是如果我要在@Stateless上更改@Stateful,我希望不存储bean的状态,并进入每个请求的清除列表,但它总是保存上一个请求的状态并显示新的数字。

有状态与无状态的区别是声明性的,而不是功能性的。如果您将会话bean声明为无状态,则您的责任是确保它在方法调用之间实际上不保留任何状态。

那么,无状态和有状态之间有什么区别?怎么看?如我所见,它们的工作原理相同。

更重要的区别之一是,如果您声明一个bean是无状态的,那么您就可以为容器提供选择,以不同的bean实例服务于不同的请求。如果选择这样做,那么这可能会使声明的无状态Bean实际上至少在一定程度上不保留状态appear。但是容器并不需要这样做,因此,如果您的无状态Bean通过保留状态而违反了其合同,那么迟早对客户端来说,这可能是可见的。

[还有更多(实际上更多-阅读the specifications),但是最重要的是我从中学到了什么。换句话说,将会话bean正确声明为无状态与有状态是其开发者与部署该容器的合同的一部分。 Bean的行为与其代码声明为无状态的要求没有什么不同。


1
投票

无状态会话bean不应携带任何形式的状态,例如实例变量。因此,容器通常维护一个无状态bean池,以便它们可以被不同的客户端重用。

Oracle文档提到有关会话bean的以下内容:http://docs.oracle.com/javaee/5/tutorial/doc/bnbly.html

但是,客户端可以更改池化的无状态Bean中实例变量的状态,并且此状态将保留到池化的无状态Bean的下一次调用。

此现象是您可能遇到的情况,为什么列表不为空。

© www.soinside.com 2019 - 2024. All rights reserved.