是否可以@Inject一个@RequestScoped bean进入@Stateless EJB?

wrs*_*der 18 stateless-session-bean java-ee cdi java-ee-6 ejb-3.1

是否可以将请求范围的CDI bean注入无状态会话bean?

我曾经问了一个相关的问题,并认为具体的CDI @RequestScoped @Stateless问题值得自己发帖.

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

我还问了一个关于JMS @MessageDriven bean的类似问题 - 基本上想要了解@Stateless的相同内容.

@RequestScoped将CDI注入@MessageDriven bean

Dav*_*ins 29

你绝对可以做你提到的事情并@RequestScoped@Stateless会话bean和@MessageDrivenbean中使用bean.这是CDI规范和TCK的核心部分,保证便携.

关于MDB的注意事项

请注意,对使用@Statelessbean的bean进行了测试@RequestScoped,但没有测试可以保证@MessageDrivenbean可以引用@RequestScopedbean.这只是一个疏忽,已经为Java EE 7 TCK修复了.所以请注意,如果它不适用于MDB案例,那可能不是你的错:)

解决方法是仅仅有你的MDB授人以任何类型的会话Bean作为@Stateless,@Stateful以及@Singleton所有具有@RequestScoped测试.

使EJB本身具有范围

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

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

  • 没关系,刚刚发现@RequestScoped在CDI中的定义比HTTP请求更广泛. (3认同)