在EJB方法/ @RequestScoped和@Stateless之间传递状态

wrs*_*der 8 ejb cdi java-ee-6 ejb-3.1

我有一个@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();
  }
}
Run Code Online (Sandbox Code Playgroud)

我认为以上不起作用 - 这是正确的吗?

我正在考虑两种选择:

  • 使用@Stateful而不是@Stateless,以及@Named和@RequestScoped.
  • 保持@Stateless并使用EJBContext.getContextDatamap替换实例变量.

哪个更好?还有其他一些我没想到的选择吗?(除了等待Java EE 7或切换到Spring.:-))

Dav*_*ins 12

虽然@Stateless,@Singleton并且@MessageDriven可以通过注入范围引用@Inject,但它们不能 @RequestScoped任何其他范围.只有@Stateful模型足够灵活以支持范围.换句话说,你可以注释@Statefulbean类本身@RequestScoped,@SessionScoped等等.

简单来说@Stateless,@Singleton已经修复了"范围". @Singleton基本上是@ApplicationScoped@Stateless或许会像一些虚构的范围内@InvocationScoped,如果存在.@MessageDrivenbean 的生命周期完全取决于驱动它的连接器,因此也不允许具有用户定义的范围.

另请参见/sf/answers/610410391/