Мне нужно передать некоторую информацию с 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.
Что говорят ваши тесты? Он делает то, что вы хотите? Работает ли он так, как вы ожидаете, что он будет работать? –
Испытания работают до сих пор ... Также все, что я читал о CDI, похоже, соответствует моему плану. Более того, я знаю о компонентах @ RequestScope'd из (веб-контекста) ManagedBeans, поэтому мне кажется неестественным использовать это в моем сценарии. –
Если все работает так, как ожидалось, и эти решения подходят вам, и то, что вы видите, соответствует документации, вы не должны беспокоиться. –