Jakarta ee 是否可以将@RequestScoped bean@injection到@Stateless EJB中?
是否可以将请求范围的CDIBean注入到无状态会话bean中 我问了一个相关的问题,并认为具体的CDI@requestscope进入了@Stateless问题值得发表自己的文章 我还问了一个关于JMS@MessageDriven bean的类似问题——基本上我想知道关于@Stateless的相同问题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的说明 请注意,对于使用@
您完全可以做您提到的事情,并在
@无状态
会话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等)在应用于它们时是有意义的。