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