是否可以将请求范围的CDI bean注入无状态会话bean?
我曾问过一个相关的问题,并认为具体的CDI @RequestScoped @Stateless问题值得自己发帖。
Passing state between EJB methods / @RequestScoped and @Stateless
我还问了一个关于JMS @MessageDriven bean的类似问题 - 基本上想知道@Stateless的相同内容。
答案 0 :(得分:29)
你绝对可以做你提到的事情并在@RequestScoped
会话bean和@Stateless
bean中使用@MessageDriven
bean。这是CDI规范和TCK的核心部分,保证便携。
请注意,对使用@Stateless
bean的@RequestScoped
bean进行了测试,但没有测试可以保证@MessageDriven
bean可以引用@RequestScoped
豆子。这只是一个疏忽而且是already fixed for the Java EE 7 TCK。所以请注意,如果它不适用于MDB案例,则可能不是您的错:)
解决方法是简单地让您的MDB委托给任何类型的SessionBean,@Stateless
,@Stateful
和@Singleton
都有@RequestScoped
次测试。
虽然@Stateless
,@Singleton
和@MessageDriven
可以通过@Inject
注入范围参考,但它们不能 @RequestScoped
或任何其他范围。只有@Stateful
模型足够灵活,可以支持范围。换句话说,您可以将@Stateful
bean类本身注释为@RequestScoped
,@SessionScoped
等。
简单来说,@Stateless
,@Singleton
已经修复了“范围”。 @Singleton
基本上是@ApplicationScoped
,而@Stateless
可能是@InvocationScoped
之类的组成范围,如果存在的话。 @MessageDriven
bean的生命周期完全取决于驱动它的连接器,因此也不允许具有用户定义的范围。