3
我應該傳遞一些HTTP請求中包含的HTTP頭信息給一個EJB,我不想在需要它們的地方添加參數並傳遞它們。所以我使用RequestScoped bean來保存我的標題值。這個實現是否正常,或者我誤解了@RecuestScoped beans的概念?使用@RequestScoped bean將Web層的標頭值傳遞給EJB?
首先我得到的頭用一個攔截器(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這應該工作的描述預期:
的請求範圍是活性:在web應用任何servlet的service()方法時
- ,所述的doFilter期間()任何servlet過濾器的方法,以及容器在任何異步方法調用期間調用任何EJB期間的任何遠程方法調用期間調用任何Java EE Web服務調用期間的任何ServletRequestListener或AsyncListener,
- 時的容器調用o在任何調用EJB超時方法期間以及在向任何EJB消息驅動的Bean傳遞消息期間以及在從Java EE組件環境獲得的JMS主題或隊列的MessageListener消息傳遞過程中,調用EJB超時方法和任何EJB。
你的測試說什麼?它是做你想做的嗎?它是否像你期望的那樣工作? –
測試工作到目前爲止......我讀到的有關CDI的所有內容似乎與我的計劃一致。更多的是我從ManagedBeans的(web)上下文中瞭解了@ RequestScope的bean,所以在我的場景中使用它會感覺不自然。 –
如果一切按預期工作,並且此解決方案適合您,並且您所看到的與文檔相匹配,則不應該擔心。 –