2017-09-27 4 views
0

Ich versuche eine benutzerdefinierte ExceptionMapper Klasse für JAX-RS zu schreiben. Ich möchte irgendwie die ursprünglich angeforderte URI aus dem JAX-RS javax.ws.rs.core.Response Objekt lesen.Wie bekomme ich den ursprünglich angeforderten URI von JAX-RS? Javax.ws.rs.core.Response

Wenn ich überprüfen Sie die Response-Objekt mit IntelliJ IDEA im Debug-Modus, dann kann ich diese Informationen unter folgendem Pfad finden: response> Kontext> resolvedUri wo
Typ des contextorg.glassfish.jersy.client.ClientResponse ist. Diese Klasse hat eine resolvedUri Variable, die die Informationen enthält, die ich brauche.

Kann ich diese Informationen irgendwie bekommen? Wie kann ich meine getRequestUri(response) Methode schreiben?

public class MyExceptionMapper implements ExceptionMapper<WebApplicationException> { 

    @Override 
    public Response toResponse(WebApplicationException error) { 

     Response response = error.getResponse(); 
     ErrorResponse errorResponse = ErrorResponseBuilder 
       .builder() 
       .httpStatus(getDefaultStatusCodeIfNull(response)) 
       .errorMessage(getCustomErrorMessage(response)) 
       .requestedUri(getRequestedUri(response)) <--------- HOW TO READ IT? 
       .build(); 

     return Response 
       .status(errorResponse.getHttpStatus()) 
       .type(ExtendedMediaType.APPLICATION_JSON) 
       .entity(errorResponse) 
       .build(); 
    } 
} 
+0

Haben Sie versucht, 'URI uri = response.getLocation(); System.out.println (uri.toString()); '? – Anddo

+0

Ich habe es versucht. Es kommt mit null zurück :( – zappee

+0

Nicht sicher, aber als Java [API doc] (http://docs.oracle.com/javaee/7/api/javax/ws/rs/core/Response.html#getLocation--) es gibt den Standort-URI sonst Null, wenn ** nicht vorhanden **. – Anddo

Antwort

0

Verwenden

@Context privat HttpServletRequest ServletRequest;

Und verwenden HttpServletRequest.getRequestURI()

public class MyExceptionMapper implements 
    ExceptionMapper<WebApplicationException> { 

    @Context 
    private HttpServletRequest servletRequest; 

    @Override 
    public Response toResponse(WebApplicationException error) { 

     Response response = error.getResponse(); 
     ErrorResponse errorResponse = ErrorResponseBuilder 
       .builder() 
       .httpStatus(getDefaultStatusCodeIfNull(response)) 
       .errorMessage(getCustomErrorMessage(response)) 
       .requestedUri(servletRequest.getRequestURI()) 
       .build(); 

     return Response 
       .status(errorResponse.getHttpStatus()) 
       .type(ExtendedMediaType.APPLICATION_JSON) 
       .entity(errorResponse) 
       .build(); 
    } 
} 
+0

Das ist eine perfekte Lösung. Funktioniert wie ein Charme. Thx. Die einzige verbleibende Frage bezieht sich auf Multithread Environment. Wie parellell Anfragen an den gleichen Ruhe-URI mit (für Beispiel) unterschiedliche Header werden behandelt? Hat jede paralell Anfrage eine eigene Instanz der MyExceptionMapper Klasse mit dem Objekt Request Objekt? – zappee

+0

@Context ist Request Scoped, so dass es eine eindeutige für jede Anfrage geben wird. – shazin

+0

vielen Dank @shazin – zappee

Verwandte Themen