Как правильно создать сессионный бин?

Рейтинг: 0Ответов: 1Опубликовано: 30.05.2011

Здравствуйте!
Пытаюсь сделать что-то вроде сессионных бинов. Но работает приложение непредсказуемо. Сервлет примерно такой:

@WebServlet(name = "MyServlet", urlPatterns = {"/goservlet.jsp"})
public class MyServlet extends HttpServlet {
    @EJB
    private MySessionBean mySessionBean;
    protected void doPost(HttpServletRequest request, HttpServletResponse response) 
              throws ServletException, IOException {
        System.out.println("Устанавливаем параметр. Текущий=" + mySessionBean.getStr1());
        mySessionBean.setStr1(request.getParameter("xaction"));
        response.sendRedirect("/zapros.jsp");

}
... ... ...

Бин у меня Stateful:

@Stateful(name = "MySessionEJB")
public class MySessionBean {
    private String str;
...

Вроде, для всех сессий должен быть свой собственный объект MySessionBean. Но при отладке, когда с разных компьютеров отправляются запросы на сервер к этому сервлету, то и для одной и для другой сессии (для одного и второго пользователя) используется один и тот же объект MySessionBean. А именно, если один пользователь изменит поле объекта, то и у другого пользователя произойдут такие же изменения. Поправьте меня, если я ошибаюсь или скажите, пожалуйста, в чем ошибка.

Ответы

▲ 1Принят

Ошибка в том, что вы думаете, что HTTP-сессии и сессии EJB имеют между собой что-то общее. На самом деле, они не обязаны как-то коррелироваться. У EJB-бинов собственный жизненный цикл и регулируется он EJB-контейнером независимо от веб-контейнера. В частности, EJB-контейней имеет внутри пул экземпляров бина и часто один и тот же экземпляр бина переиспользуется так что значения могут сохраняться даже у stateless бинов, хоть они и не обязаны ничего такого делать.