Передать значение заголовка из веб-уровня в EJB с помощью bean-компонента @RequestScoped?

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

Сначала я получаю заголовки с помощью перехватчика (Resteasy) и сохраняю их в свой bean-компонент request scoped:

@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 это должно работать как положено:

Область запроса активна:

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

person Mathias Begert    schedule 28.12.2015    source источник
comment
Что говорят ваши тесты? Он делает то, что вы хотите? Работает ли он так, как вы ожидаете?   -  person JB Nizet    schedule 28.12.2015
comment
Тесты работают до сих пор ... Также все, что я читал о CDI, кажется, соответствует моему плану. Я больше знаю о bean-компонентах @RequestScope'd из (веб-контекста) ManagedBeans, поэтому использование этого в моем сценарии кажется неестественным.   -  person Mathias Begert    schedule 28.12.2015
comment
Если все работает так, как ожидалось, и это решение вас устраивает, и то, что вы видите, совпадает с документацией, вас не должно это беспокоить.   -  person JB Nizet    schedule 28.12.2015


Ответы (1)


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

person aschoerk    schedule 26.08.2017