2017-08-29 101 views
0

我需要轉發到REST服務的請求,並作出這樣的代碼:新澤西Servlet的:RequestDispatcher的返回404

private void performTask(HttpServletRequest request, HttpServletResponse response) throws ServletException, 
IOException { 
    ServletContext portalContext = this.getServletContext(); 
    ServletContext restService = portalContext.getContext("/restService"); 
    RequestDispatcher dispatcher = restService.getRequestDispatcher("/resources/*"); 
    dispatcher.forward(request, response); 

} 

服務「/ restService」還具有處理該請求的servlet和它的定義如下:

<servlet> 
    <servlet-name>Jersey REST Service</servlet-name> 
    <servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class> 
    <init-param> 
     <param-name>javax.ws.rs.Application</param-name> 
     <param-value>com.service.RESTApplication</param-value> 
    </init-param> 
    <init-param> 
     <param-name>jersey.config.server.provider.packages</param-name> 
     <param-value>com.rest.resources</param-value> 
    </init-param> 
    <load-on-startup>1</load-on-startup> 
</servlet> 
<servlet-mapping> 
    <servlet-name>Jersey REST Service</servlet-name> 
    <url-pattern>/resources/*</url-pattern> 
</servlet-mapping> 

類RESTApplication有這樣的代碼:

public RESTApplication() { 
    register(WadlFeature.class); 
    register(JacksonFeature.class); 
    register(MultiPartFeature.class); 
    property(CommonProperties.FEATURE_AUTO_DISCOVERY_DISABLE, true); 
} 

有Severa的將「com.rest.resources」中的l類映射到請求附帶的路徑(/ resources/*)。 但是,當請求被「getRequestDispatcher」轉發時,Jersey會拋出404錯誤。看來澤西島不能將我的請求映射到正確的servlet。如果我使用Postman粘貼相同的URL,則請求正常處理。該檢查調度的是: enter image description here

爲了驗證是否問題是與新澤西,我已經創建了一個自HttpServlet延伸並不會提交到新澤西州一個Servlet:

<servlet> 
    <servlet-name>HelloServlet</servlet-name> 
    <servlet-class>com.rest.resources.helloResource</servlet-class> 
    <load-on-startup>1</load-on-startup> 
</servlet> 

在此之後我執行該代碼:

private void performTask(HttpServletRequest request, HttpServletResponse response) throws ServletException, 
IOException { 
    ServletContext portalContext = this.getServletContext(); 
    ServletContext restService = portalContext.getContext("/restService"); 
    RequestDispatcher dispatcher = restService.getRequestDispatcher("/hello"); 
    dispatcher.forward(request, response); 
} 

Surprisely,此正向實現類helloResource其被放置成 「com.rest.resources」。

有沒有人遇到類似的東西? ?如何 「getRequestDispacther」 發現並轉發現有的 「/資源/」 servlet的*

版本中使用: 球衣2.6 的servlet 2.5 的JBoss 4.2.3-GA

+0

所以'你好'工程和'資源'不?我想知道「資源」路徑是否已經被servlet使用了一些保留路徑? –

+0

@JorgeCampos是的,與「你好」工作得很好。這對我來說似乎不是一個保留字的問題,但是在轉發請求時是Jersey問題 –

回答

0

看來, Jersey希望「getRequestDispatcher」完成必須處理的URL,而不是將其委託給映射的servlet。

問題用這條線解決:

RequestDispatcher的調度= datasulRest.getRequestDispatcher( 「/資源/」 + request.getPathInfo());

在此之後,請求被放置到「com.rest.resources」中的資源處理。