19

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

我曾问过一个相关问题,并认为特定的 CDI @RequestScoped 到 @Stateless 问题值得发表。

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

我还问了一个关于 JMS @MessageDriven bean 的类似问题——基本上想知道关于 @Stateless 的相同问题。

@RequestScoped CDI 注入到 @MessageDriven bean

4

1 回答 1

34

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

关于 MDB 的注意事项

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

解决方法是简单地将您的 MDB 委托给任何类型的 SessionBean,如@Stateless, @Stateful,并且@Singleton都具有@RequestScoped测试。

使 EJB 本身具有范围

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

简单来说@Stateless@Singleton已经固定了“范围”。 @Singleton本质上是@ApplicationScoped并且@Stateless可能是一些虚构的范围@InvocationScoped,如果存在的话。bean的生命周期@MessageDriven完全取决于驱动它的连接器,因此也不允许有用户定义的范围。

于 2012-01-03T23:30:43.433 回答