2017-08-29 1 views
0

Ich brauche eine Anfrage an einen REST-Service zu übermitteln und machte diesen Code:Jersey Servlets: Request Rückkehr 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); 

} 

Service „/ restService“ hat auch ein Servlet, das die Anforderung verarbeitet und es wird wie folgt definiert:

<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> 

Die Klasse RESTApplication hat diesen Code:

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

Es gibt severa l Klassen bei "com.rest.resources", die dem Pfad zugeordnet sind, der mit der Anfrage geliefert wird (/ resources/*). Aber wenn die Anfrage von "getRequestDispatcher" weitergeleitet wird, löst Jersey einen Fehler 404. Es scheint, dass Jersey meine Anfrage nicht dem richtigen Servlet zuordnen kann. Wenn ich dieselbe URL mit Postman einfüge, wird die Anfrage normal verarbeitet. Der von Dispatcher überprüfen ist: enter image description here

Um zu überprüfen, ob das Problem mit Jersey war, habe ich ein Servlet erstellt, die von HttpServlet erweitert und ist nicht auf Jersey vorgelegt:

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

Danach , ausgeführt ich diesen Code:

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, diese vorwärts erreicht Klasse helloResource, die in "com.rest.resources" gesetzt wird.

Hat jemand etwas ähnliches vor? ? Wie kann "getRequestDispacther" finden und leitet das Servlet unter "/ resources/" *

Versionen verwendet bestehende: Jersey 2.6 Servlet 2.5 Jboss 4.2.3-GA

+0

Also hallo funktioniert und 'Ressourcen' nicht? Ich frage mich, ob 'Ressourcen' Pfad ist ein reservierter Pfad bereits vom Servlet verwendet? –

+0

@JorgeCampos ja, mit "Hallo" hat fein gearbeitet. Es schien mir kein Problem mit reservierten Wörtern zu sein, sondern ein Jersey-Problem, als ich die Anfrage weitergab –

Antwort

0

Es scheint, dass Jersey erwartet, dass "getRequestDispatcher" die URL erfüllt, die verarbeitet werden muss, anstatt diese an das zugeordnete Servlet zu delegieren.

Das Problem mit dieser Linie gelöst wurde:

Request Dispatcher = datasulRest.getRequestDispatcher ("/ resources /" + request.getPathInfo());

Danach wurde die Anfrage von den Ressourcen in "com.rest.resources" verarbeitet.