2017-09-27 54 views
0

我正在嘗試爲JAX-RS編寫一個定製的ExceptionMapper類。我想以某種方式讀取來自JAX-RS javax.ws.rs.core.Response對象的原始請求URI。如何從JAX-RS獲取原始請求的URI javax.ws.rs.core.Response

當我檢查與在調試模式下的IntelliJ IDEA響應對象然後我可以看到下面的路徑下此信息:響應>上下文> resolvedUri其中
類型context的是org.glassfish.jersy.client.ClientResponse。這個類有一個resolvedUri變量,它擁有我需要的信息。

我能以某種方式獲得這些信息嗎?我如何寫我的getRequestUri(response)方法?

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

你試過'URI URI = response.getLocation(); System.out.println(uri.toString());'? – Anddo

+0

我試過了。它返回null :( – zappee

+0

不確定,但作爲Java [API文檔](http://docs.oracle.com/javaee/7/api/javax/ws/rs/core/Response.html#getLocation--)它如果**不存在,則返回位置URI,否則返回null – Anddo

回答

0

使用

@Context 私人的HttpServletRequest的servletRequest;

並使用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

這是一個完美的解決方案,它像一個魅力Thx,唯一一個仍然存在的問題是與多線程環境有關,如何parelell請求調用相同的其餘URI例如)處理了不同的頭文件?每個併發請求都有自己的帶有屬性請求對象的MyExceptionMapper類的實例嗎? – zappee

+0

@Context是請求作用域,因此每個請求都會有一個唯一的實例 – shazin

+0

非常感謝@shazin – zappee