【问题标题】:Injecting @RequestScoped variable in singleton in wildfly在wildfly的单例中注入@RequestScoped变量
【发布时间】:2019-04-28 16:22:49
【问题描述】:

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

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

【问题讨论】:

    标签: java wildfly cdi


    【解决方案1】:

    对具有正常范围(例如 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 方法)获取正确的实例

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-06-02
      • 1970-01-01
      • 2015-07-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-04-17
      • 1970-01-01
      相关资源
      最近更新 更多