У меня есть @RequestScoped CDI bean, который я хочу превратить в EJB, чтобы получить декларативные транзакции. (Я на EJB 3.1, Java EE 6)Проходящее состояние между методами EJB/@RequestScoped и @Stateless
В настоящее время я передаю состояние между подпрограммами в предположении, что экземпляр используется только в одном запросе. Если я добавлю @Stateless
, это предположение изменилось бы.
Например, я хочу сделать что-то вроде
@Stateless
@Named
@RequestScoped
public class Foo {
private String var1; // can't use instance vars in @Stateless?
private String var2;
public void transactionForRequest() {
var1 = value;
var2 = value;
....
subroutine();
}
}
Я предполагаю, что выше не работы- это правильно?
я рассматриваю два варианта:
- Используйте @Stateful вместо @Stateless, наряду с @Named и @RequestScoped.
- Храните @Stateless и используйте карту
EJBContext.getContextData
для замены переменных экземпляра.
Что лучше? И есть ли другая альтернатива, о которой я не думаю? (Кроме того, подождите, пока Java EE 7 или переключится на Spring. :-))
Использование '@ Stateful' может быть более фотоискусство. Считаете ли вы, что с помощью обычного компонента Faceless bean и управляемого компонента '@ ConversationScoped' передаются состояния? –
Как бы это сработало - вы бы сделали EJB '@ Stateless', а затем' @ Inject' CDI bean? Может ли этот CDI быть '@ RequestScoped'? – wrschneider
Я бы сохранил bean-компонент как '@ Stateless' и использовал' @ ConversationScoped' bean для передачи переменных со страниц на страницы. Ознакомьтесь с этой статьей [http://blog.goyello.com/2011/06/08/jee6-cdi-and-conversation-scope/] о создании мастера. –