如何从Spring中的WebRequest获取请求的URI?

The*_*der 4 spring spring-mvc spring-rest

我使用REST处理异常@ControllerAdvice,并ResponseEntityExceptionHandler在一个弹簧安置web服务.到目前为止,一切都运行良好,直到我决定将URI路径(已发生异常)添加到BAD_REQUEST响应中.

@ControllerAdvice
public class RestResponseEntityExceptionHandler extends ResponseEntityExceptionHandler {

@Override
protected ResponseEntity<Object> handleHttpMessageNotReadable(HttpMessageNotReadableException ex,
        HttpHeaders headers, HttpStatus status, WebRequest request) {
    logger.info(request.toString());
    return handleExceptionInternal(ex, errorMessage(HttpStatus.BAD_REQUEST, ex, request), headers, HttpStatus.BAD_REQUEST, request);
}

private ApiError errorMessage(HttpStatus httpStatus, Exception ex, WebRequest request) {
    final String message = ex.getMessage() == null ? ex.getClass().getName() : ex.getMessage();
    final String developerMessage = ex.getCause() == null ? ex.toString() : ex.getCause().getMessage();
    return new ApiError(httpStatus.value(), message, developerMessage, System.currentTimeMillis(), request.getDescription(false));
}
Run Code Online (Sandbox Code Playgroud)

ApiError只是一个Pojo类:

public class ApiError {

    private Long timeStamp;
    private int status;
    private String message;
    private String developerMessage;
    private String path;
}
Run Code Online (Sandbox Code Playgroud)

但是WebRequest没有给出任何api来获取请求失败的路径.我试过: request.toString()返回 - > ServletWebRequest:uri =/signup; client = 0:0:0:0:0:0:0:1
request.getDescription(false)返回 - > uri =/signup
getDescription非常接近要求,但不符合要求.有没有办法只获得uri部分?

The*_*der 14

找到了解决方案.铸造WebRequestServletWebRequest解决的目的.

((ServletWebRequest)request).getRequest().getRequestURI().toString()
Run Code Online (Sandbox Code Playgroud)

返回完整路径 - http://localhost:8080/signup

  • 代替`getRequestURL()`,`getRequestURI()` 用于获取问题中的URI。 (3认同)

Vis*_*war 9

这个问题有多种解决方案。

1) 可以使用 webRequest.getDescription(true) 从 WebRequest 获取请求 URI 和客户端信息。

true 将显示用户的信息,例如客户端 ID,而 false 将仅打印 URI。

2) 直接在方法定义中使用 HttpServletRequest 代替 WebRequest

@Override
protected ResponseEntity<Object> handleHttpMessageNotReadable(HttpMessageNotReadableException ex,
        HttpHeaders headers, HttpStatus status, WebRequest request, HttpServletRequest httpRequest) {
    logger.info(httpRequest.getRequestURI());
    return handleExceptionInternal(ex, errorMessage(HttpStatus.BAD_REQUEST, ex, request), headers, HttpStatus.BAD_REQUEST, request);
}
Run Code Online (Sandbox Code Playgroud)