Jakarta ee 是否可以将@RequestScoped bean@injection到@Stateless EJB中?

Jakarta ee 是否可以将@RequestScoped bean@injection到@Stateless EJB中?,jakarta-ee,java-ee-6,cdi,ejb-3.1,stateless-session-bean,Jakarta Ee,Java Ee 6,Cdi,Ejb 3.1,Stateless Session Bean,是否可以将请求范围的CDIBean注入到无状态会话bean中 我问了一个相关的问题,并认为具体的CDI@requestscope进入了@Stateless问题值得发表自己的文章 我还问了一个关于JMS@MessageDriven bean的类似问题——基本上我想知道关于@Stateless的相同问题 您完全可以做您提到的事情,并在@无状态会话bean和@消息驱动bean中使用@RequestScopedbean。这是CDI规范和TCK的核心部分,保证可移植 关于MDB的说明 请注意,对于使用@

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

我问了一个相关的问题,并认为具体的CDI@requestscope进入了@Stateless问题值得发表自己的文章

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


您完全可以做您提到的事情,并在
@无状态
会话bean和
@消息驱动
bean中使用
@RequestScoped
bean。这是CDI规范和TCK的核心部分,保证可移植

关于MDB的说明 请注意,对于使用
@RequestScoped
bean的
@Stateless
bean有一个测试,但是没有任何测试可以保证
@MessageDriven
bean可以引用
@RequestScoped
bean。这只是一个疏忽,也是一个错误。因此,请注意,如果MDB案例不起作用,可能不是您的错:)

解决方法是将MDB委托给任何类型的SessionBean,如
@Stateless
@Stateful
@Singleton
都有
@requestscope
测试

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


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

您可以这样做,它是一个代理,但它在概念上有意义吗?难道你不想反过来做吗?这最终会产生更加自然和自我记录的代码。公平的一点——即使它有效,也很难一眼看出发生了什么。@BalusC I也表示怀疑,但请查阅请求范围的CDI定义。它不仅是http请求范围,而且还包括对异步方法、远程方法、mdb处理消息等的请求。因此,从这个意义上讲,它可以作为TLS数据的一种替换。David,在mdb中注入请求范围的内容是如何工作的?假设我的MDB是在cron定时器触发时由Quartz RA触发的。那时没有活动的http请求。范围从何而来?如果从来没有真正的请求开始,它什么时候会结束?没关系,只是发现@RequestScoped在CDI中的定义比HTTP请求更广泛。本文说@Stateless bean只能是@Dependent的:我想这只是他们说@Stateless bean有自己的生命周期,没有别的(@RequestScoped、@SessionScoped等)在应用于它们时是有意义的。