2014-01-15 27 views
1

我想知道是否有可能將請求從servlet分派到Jersey(JAX-RS實現)資源類。我試圖做到這一點,但似乎沒有工作,根據我的記錄,球衣資源永遠不會達到。如何分配servlet請求到澤西資源方法

代碼示例如下。由於某種原因,我正在努力做什麼?

請注意,澤西島資源正常工作,當我通過地址欄直接在網絡瀏覽器訪問它。

另請注意'RequestDispatcher.forward()'按預期工作。這只是'包括',沒有。

該servlet

//The Jersey dispatcher url-filter is set to '/api/*' 
String servletID = "/api/items"; 
RequestDispatcher dispatcher = getServletContext().getRequestDispatcher(servletID); 
dispatcher.include(request, response);  

澤西資源

@GET @Path("/items") 
@Produces ({MediaType.TEXT_XML}) 
public JAXBElement<Items> getItems(@PathParam("project") String project) throws  IOException, JAXBException { 

    log.debug("reached getItems"); 

    //Omitted code that returns 'Items' object wrapped in JAXBElement 

} 

web.xml中的相關部分

<servlet> 
    <servlet-name>jerseyDispatcher</servlet-name> 
    <servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class> 
    <init-param> 
     <param-name>jersey.config.server.provider.packages</param-name> 
     <param-value>uk.co.web.api.resource</param-value> 
    </init-param> 
</servlet> 

<servlet-mapping> 
    <servlet-name>jerseyDispatcher</servlet-name> 
    <url-pattern>/api/*</url-pattern> 
</servlet-mapping> 
+0

請包含創建'dispatcher'的代碼。 – 2014-01-16 08:03:42

+0

@LutzHorn我已編輯的問題,包括這個現在 – Paul

+0

你有沒有得出結論,如何實現與澤西島? – tareq

回答

0

您可能會轉發請求。

HttpServletRequest httpServletRequest = (HttpServletRequest) servletRequest; 
RequestDispatcher requestDispatcher = null; 
requestDispatcher = httpServletRequest.getRequestDispatcher("/items"); 
dispatcher.forward(request, response); 
return; 

但是請注意,如果你收到一個GET請求,並嘗試着以一個POST資源, 它會拋出一個405錯誤。

編輯:

讓我明白你正在努力實現的,如果你需要寫的內容,你可以使用的球衣資源濾波器響應輸出流的內容。

public class YourResourceFilter implements ResourceFilter 
    { 
    public ContainerRequestFilter getRequestFilter() 
     { 
      return new ContainerRequestFilter() 
      { 
       @Override 
       public ContainerRequest filter(ContainerRequest containerRequest) 
       { 
//Pre- editing the request 
       return containerRequest; 
       } 
      }; 
     } 

    @Override 
     public ContainerResponseFilter getResponseFilter() 
     { 
      return new ContainerResponseFilter() 
      { 
       @Override 
       public ContainerResponse filter(ContainerRequest containerRequest, ContainerResponse containerResponse) 
       { 
// after the request has been completed by your jersey resource 
        return containerResponse; 
       } 
      }; 
     } 

    } 
+0

我不能轉發請求,遺憾的是servlet需要在輸出流中添加更多內容 – Paul

+0

對不起,我不認爲你理解這個問題。我想分派一個首先由javax.servlet.http.HttpServlet處理到Jersey資源方法的請求。 – Paul

+0

我試着用'include'發佈的內容得到了問題對不起,我只是提出了一種不同的方法來滿足您的需求'事後添加更多內容到輸出流'。 – Gerard

0

我通過配置Jersey作爲過濾器,而不是servlet,在web.xml中使它工作,排序(Jersey 2.13)。然後,你可以告訴容器過濾器適用於包括請求過:那麼

<filter-mapping> 
    <filter-name>Jersey Web Application</filter-name> 
    <url-pattern>/api/*</url-pattern> 
    <dispatcher>FORWARD</dispatcher> 
    <dispatcher>INCLUDE</dispatcher> 
    <dispatcher>REQUEST</dispatcher> 
</filter-mapping> 

RequestDispatcher.include將爲請求澤西處理工作,太。但有一點需要注意。 Jersey調用response.getOutputStream,所以全部輸出必須通過所述輸出流執行 - 這排除了JSP頁面,它使用response.getWriter代替。因此,除非您找出如何解決該問題,否則忘記在JSP頁面中包含Jersey資源,反之亦然,包括評估JSP作爲REST響應的一部分的結果。

+0

您可以提供一個鏈接,它說如何包含''標籤?我無法使它工作,當它包含在'web.xml'中時,eclipse說'無效的內容......' – tareq

+0

(http://sqltech.cl/doc/oas10gR31/web.1013/b28959/filters.htm#BCFIEDGB);在Servlet 2.4中添加了'',確保你聲明瞭正確的web.xml序言。 –