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
找到了解决方案.铸造WebRequest到ServletWebRequest解决的目的.
((ServletWebRequest)request).getRequest().getRequestURI().toString()
Run Code Online (Sandbox Code Playgroud)
返回完整路径 - http://localhost:8080/signup
这个问题有多种解决方案。
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)
| 归档时间: |
|
| 查看次数: |
4473 次 |
| 最近记录: |