2015-12-28 59 views
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。
+0

你的測試說什麼?它是做你想做的嗎?它是否像你期望的那樣工作? –

+0

測試工作到目前爲止......我讀到的有關CDI的所有內容似乎與我的計劃一致。更多的是我從ManagedBeans的(web)上下文中瞭解了@ RequestScope的bean,所以在我的場景中使用它會感覺不自然。 –

+0

如果一切按預期工作,並且此解決方案適合您,並且您所看到的與文檔相匹配,則不應該擔心。 –

回答

0

該實現是正確的,但它似乎是一個不必要的優化使用副作用。