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

时间:2018-11-27 00:19:14

标签: java wildfly cdi

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

如果我随后将该bean注入一个用@Singleton注释的类中,并一次运行多个请求,我会看到Wildfly正按预期使用我的singleton类的单个实例,但是看来它在为我的请求范围做代理魔术变量。我的请求范围变量在每个请求中都不同,即使它们使用的是单例的相同实例。我的印象是您不能在单例中使用请求范围的变量,Wildfly现在允许您执行此操作吗?这是怎么回事?

1 个答案:

答案 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方法)获取正确的实例