2015-12-28 2 views
3

Мне нужно передать некоторую информацию с HTTP-заголовком из запроса в EJB, и я не хочу добавлять параметры и передавать их везде, где они мне нужны. Поэтому я использовал компонент RequestScoped для хранения значений заголовков. Является ли эта реализация нормально, или я неправильно понимаю концепцию @RecuestScoped beans?Передайте значение заголовка из веб-уровня в EJB с помощью @RequestScoped bean?

Сначала я получить заголовки с перехватчиком (Resteasy), и сохраните их в мой запроса области действия боба:

@Provider 
@ServerInterceptor 
public class SomeInterceptor implements PreProcessInterceptor { 

    @Inject 
    ApplicationRequestContext appContext; 

    @Override 
    public ServerResponse preProcess(HttpRequest request, ResourceMethod resourceMethod) 
      throws Failure, WebApplicationException { 
     List<String> values = request.getHttpHeaders().getRequestHeader("Some-Header"); 
     if(values != null && values.size() > 0) { 
      appContext.setSomeHeader(values.get(0)); 
     } 
     return null; 
    } 
} 

Это боб:

@RequestScoped 
public class ApplicationRequestContext implements Serializable { 
    private String someHeader; 

    public void setSomeHeader(String someHeader) { 
     this.someHeader = someHeader; 
    } 

    public String getSomeHeader() { 
     return someHeader; 
    } 
} 

Тогда я могу получить доступ значение (по-разному в каждом запросе) от моего EJB:

@Stateless 
public class CheckInWorkflow { 

    @Inject 
    ApplicationRequestContext appContext; 

    public void someEjbMethod() { 
     doSomethingWithThisHeaderValue(appContext.getSomeHeader()); 
    } 
} 

На основании описания @RequestScoped это должно работать, как ожидалось:

Объем активного запроса:

  • во время метода службы() любого сервлета в веб-приложения, в течение doFilter() Способ по любому из сервлет фильтра и когда контейнер вызывает какой-либо сервлет или AsyncListener,
  • в любом вебе-службе вызова Java EE,
  • во время любого удаленного вызова метода любого EJB, во время асинхронного вызова метода O f любой EJB во время любого вызова метода тайм-аута EJB и
  • во время доставки сообщения в любой компонент, управляемый сообщениями EJB, и во время любой доставки сообщения в MessageListener для темы JMS или очереди, полученной из среды компонентов Java EE.
+0

Что говорят ваши тесты? Он делает то, что вы хотите? Работает ли он так, как вы ожидаете, что он будет работать? –

+0

Испытания работают до сих пор ... Также все, что я читал о CDI, похоже, соответствует моему плану. Более того, я знаю о компонентах @ RequestScope'd из (веб-контекста) ManagedBeans, поэтому мне кажется неестественным использовать это в моем сценарии. –

+0

Если все работает так, как ожидалось, и эти решения подходят вам, и то, что вы видите, соответствует документации, вы не должны беспокоиться. –

ответ

0

Реализация правильная, но она кажется ненужной оптимизацией с использованием побочных эффектов.

Смежные вопросы