我有一个以REST API形式运行的Java EE应用程序。在运行端点逻辑之前,过滤器会从标头中获取JWT并将用户设置为请求范围的变量,例如此处提出的CDI解决方案:https://stackoverflow.com/a/26778123/4236181
如果我随后将该bean注入一个用@Singleton注释的类中,并一次运行多个请求,我会看到Wildfly正按预期使用我的singleton类的单个实例,但是看来它在为我的请求范围做代理魔术变量。我的请求范围变量在每个请求中都不同,即使它们使用的是单例的相同实例。我的印象是您不能在单例中使用请求范围的变量,Wildfly现在允许您执行此操作吗?这是怎么回事?
答案 0 :(得分:2)
对具有正常范围(例如RequestScope)的bean的上下文引用不是对bean上下文实例的直接引用。相反,上下文引用是一个``客户端代理''对象。调用方法时,代理将查找当前实例。因此您可以单例使用RequestScope
https://developer.jboss.org/blogs/stuartdouglas/2010/10/12/weld-cdi-and-proxies看起来像这样:(显示一个客户端代理)。
public class PaymentProcessor_$$Proxy extends PaymentProcessor
{
public void processPayment(int amount)
{
PaymentProcessor instance = lookupBean();
instance.processPayment(amount);
}
private PaymentProcessor lookupBean()
{
//get the correct instance from the BeanManager and return it
}
}
如您所见,客户端代理从BeanManager(lookupBean方法)获取正确的实例