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

时间:2012-01-03 18:37:12

标签: java-ee java-ee-6 cdi ejb-3.1 stateless-session-bean

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

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

Passing state between EJB methods / @RequestScoped and @Stateless

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

@RequestScoped CDI injection into @MessageDriven bean

1 个答案:

答案 0 :(得分:29)

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

关于MDB的注意事项

请注意,对使用@Stateless bean的@RequestScoped bean进行了测试,但没有测试可以保证@MessageDriven bean可以引用@RequestScoped豆子。这只是一个疏忽而且是already fixed for the Java EE 7 TCK。所以请注意,如果它不适用于MDB案例,则可能不是您的错:)

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

使EJB本身具有作用域

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

简单来说,@Stateless@Singleton已经修复了“范围”。 @Singleton基本上是@ApplicationScoped,而@Stateless可能是@InvocationScoped之类的组成范围,如果存在的话。 @MessageDriven bean的生命周期完全取决于驱动它的连接器,因此也不允许具有用户定义的范围。