Внедрение переменной @RequestScoped в синглтон в wildfly - PullRequest
0 голосов
/ 27 ноября 2018

У меня есть приложение Java EE, работающее на wildfly, действующее как REST API.Перед запуском логики конечной точки фильтр извлекает JWT из заголовков и задает пользователю переменную области запроса, как предложенное здесь решение CDI: https://stackoverflow.com/a/26778123/4236181

Если я затем внедряю этот компонент в класспомеченные @Singleton и выполняющие несколько запросов одновременно, я вижу, что Wildfly использует один экземпляр моего синглтон-класса, как и ожидалось, но, похоже, он выполняет прокси-магию для моей переменной области запроса.Моя переменная в области запросов отличается в каждом запросе, даже если они используют один и тот же экземпляр синглтона.У меня сложилось впечатление, что вы не можете использовать переменные области запроса в синглтоне, позволяет ли Wildfly сделать это сейчас?Что здесь происходит?

1 Ответ

0 голосов
/ 27 ноября 2018

Контекстная ссылка на компонент с нормальной областью действия (например, RequestScope) не является прямой ссылкой на контекстный экземпляр компонента.Вместо этого контекстная ссылка является прокси-объектом клиента.когда метод вызывается, прокси ищет текущий экземпляр.так что вы можете использовать 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)

...