在wildfly中的singleton中注入@RequestScoped变量



我有一个在wildfly中运行的Java EE应用程序,作为REST API。在运行端点逻辑之前,过滤器从标头中获取JWT,并将用户设置在请求范围的变量上,如这里提出的CDI解决方案:https://stackoverflow.com/a/26778123/4236181

如果我将该bean注入到一个用@Singleton注释的类中,并同时运行多个请求,我可以看到Wildfly正在按预期使用我的Singleton类的一个实例,但它似乎在为我的请求范围变量发挥代理作用。我的请求范围变量在每个请求中都是不同的,即使它们使用的是同一个singleton实例。我的印象是,你不能在单例中使用请求范围的变量,Wildfly现在允许你这样做吗?这里发生了什么?

对具有正常作用域(如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方法(获得正确的实例

最新更新