![](/img/trans.png)
[英]Combine Resteasy async fail to inject SessionScoped and RequestScoped bean with CDI
[英]Inject a @RequestScoped bean twice as different instances
我有以下情况(Java EE、CDI、jax.rs):
我有一个 RequestScoped Bean,它存储在请求的实时时间中使用的一些数据:
MyHandler.java:
@RequestScoped
public class MyHandler
{
....
}
然后我有我的 REST 调用,它使用我的 Handler Bean 的两个不同实例:
MyRestCall.java:
@Stateless
public class MyRestCall
{
@Inject
MyHandler handlerA;
@Inject
MyHandler handlerB;
....
}
然而,发生的情况是, handlerA和handlerB是同一个对象。 但我想要两个不同的。 我怎样才能以适当的方式实现这一目标? 当然,我可以创建一个基类处理程序,然后导出两个独立的类HandlerA和HandlerB和@Inject他们作为handlerA和handlerB。 但我希望有一种更清洁的方式。
这个 bean 是请求范围的,因此在请求生命周期中的所有处理过程中应该只有一个这样的 bean。 你不应该期望得到一个新的。
具有这种行为的范围是@Dependent
范围。 你有没有想过把它用在那个豆子上? 每次注入它时它都会产生新的 bean,因此它看起来是一个更好的解决方案。 当然,在您使用相同 bean 的其他地方,将会注入新的 bean。
@Inject
@New(MyHandler.class)
Instance<MyHandler> handlerInstanceA;
@Inject
@New(MyHandler.class)
Instance<MyHandler> handlerInstanceB;
然后使用以下方法获取您的实例:
MyHandler handlerA = handlerInstanceA.get();
MyHandler handlerB = handlerInstanceB.get();
文档说@New
在 CDI 1.1 中被弃用,而应该使用@Dependent
范围:
所以使用:
@Inject
MyHandler handlerA;
@Inject
MyHandler handlerB;
由于@Dependent
是默认的 CDI 作用域,因此请让您的MyHandler
不带注释或使用@Dependent
MyHandler
进行注释:
@Dependent
public class MyHandler {...}
根据@Dependent
文档:
使用范围
@Dependent
声明的 Bean 与具有其他内置范围类型的 Bean 的行为不同。 当 bean 被声明为具有作用域@Dependent
:• 没有注入的 bean 实例在多个注入点之间共享。
• 注入到容器正在创建的对象中的 bean 的任何实例都绑定到新创建对象的生命周期。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.