在 wildfly 的单例中注入 @RequestScoped 变量

Injecting @RequestScoped variable in singleton in wildfly

我有一个 Java EE 应用程序 运行ning in wildfly 作为 REST API。在端点逻辑 运行 之前,过滤器从 headers 中获取 JWT 并将用户设置在请求范围的变量上,如此处提出的 CDI 解决方案:

如果我随后将那个 bean 注入到一个 class 中,并用 @Singleton 和 运行 注释了多个请求,我可以看到 Wildfly 正在使用我的单例 class正如预期的那样,但它似乎正在为我的请求范围变量做代理魔法。我的请求范围变量在每个请求中都是不同的,即使它们使用的是相同的单例实例。我的印象是你不能在单例中使用请求范围的变量,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 方法)获取正确的实例