我有一个在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方法(获得正确的实例