【发布时间】:2012-01-03 03:00:28
【问题描述】:
我有一个 @RequestScoped CDI bean,我想将其转换为 EJB 以获取声明性事务。 (我使用的是 EJB 3.1,Java EE 6)
目前,我在子例程之间传递状态,假设实例仅用于单个请求。如果我现在添加@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可能是一种过度技能。您是否考虑过使用普通的无状态 bean 和@ConversationScoped托管 bean 来传递状态? -
这将如何工作 - 你会让 EJB
@Stateless然后@Inject成为 CDI bean 吗?这个 CDI bean 可以是@RequestScoped吗? -
我将 bean 保留为
@Stateless并使用@ConversationScopedbean 在页面之间传递变量。看看这个article关于创建向导。 -
我不想进行类似向导的对话 - 我想在单个 HTTP 请求/数据库事务范围内的子例程之间传递变量。
-
如果是这样,带有 Stateless bean 的
@SessionScopedbean 可能仍然比 Stateful bean 更容易管理。