2010-05-14 3 views
6

Я экспериментирую с EJB3Как получить новый сеансовый компонент с состоянием в потоке сервлета?

Я хотел бы вставить сессионный компонент с состоянием в сервлет, чтобы каждый пользователь, попавший в сервлет, получал новый bean-компонент.

Очевидно, я не могу позволить bean быть переменной экземпляра для сервлета, поскольку это будет общим. А apparantly инъекционные локальные переменные не допускаются.

Я могу использовать новый оператор для создания компонента, но это не похоже на правильный подход.

Есть ли правильный способ сделать это? Похоже, что то, что я пытаюсь сделать, довольно просто, в конце концов, мы хотели бы, чтобы каждый новый клиент нашел пустую корзину покупок.

ответ

14

Вы не можете использовать new, чтобы получить новый SFSB.

Что вы обычно делаете, это lookup новый, используя InitialContext.

MyBean bean = (MyBean) new InitialContext().lookup(name); 

Затем вы получаете ссылку на конкретный SFSB, который можно использовать повторно в запросах.

От this answer:

Вы не должны, как правило, вводят SFSB, , если это не в другой SFSB или в клиента Java EE. Вы должны использовать @EJB в ссылочном классе (например, ваш сервлет ), чтобы объявить ejb-ref и , затем выполните поиск JNDI в коде до , чтобы получить экземпляр. Затем этот экземпляр можно разместить непосредственно на вашей сессии Http.

Для получения дополнительной информации о SFSB, вы можете быть заинтересованы в этих других ответах от меня:

Надеется, что это помогает.

+0

Каким должно быть имя для нового SFSB? –

+0

Вы должны иметь возможность указать 'имя' в' @Stateful (name = "xxx") 'и использовать его для поиска. Это на самом деле немного сложнее, и существуют разные типы имен (см. 'BeanName',' name' и 'mappedName') и должен ли использоваться префикс' java: comp/env/'или нет. Я никогда не помню тонкостей между ними. Попробуйте простейший случай, и в противном случае возникнет другой вопрос. – ewernli

Смежные вопросы