Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/spring-mvc/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/selenium/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Spring 如何获取请求';春天WebRequest的URI是什么?_Spring_Spring Mvc_Spring Rest - Fatal编程技术网

Spring 如何获取请求';春天WebRequest的URI是什么?

Spring 如何获取请求';春天WebRequest的URI是什么?,spring,spring-mvc,spring-rest,Spring,Spring Mvc,Spring Rest,我在SpringRESTWebService中使用@ControllerAdvice和ResponseEntityExceptionHandler处理REST异常。到目前为止,一切正常,直到我决定将URI路径(发生异常)添加到BAD_请求响应中 @ControllerAdvice public class RestResponseEntityExceptionHandler extends ResponseEntityExceptionHandler { @Override protected

我在SpringRESTWebService中使用
@ControllerAdvice
ResponseEntityExceptionHandler
处理REST异常。到目前为止,一切正常,直到我决定将
URI
路径(发生异常)添加到BAD_请求响应中

@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));
}
但是WebRequest没有提供任何api来获取请求失败的路径。我试过:
request.toString()
returns->ServletWebRequest:uri=/signup;客户端=0:0:0:0:0:0:0:0:1
request.getDescription(false)
returns->uri=/signup

getDescription
与需求非常接近,但不符合要求。有没有办法只获取uri部分?

找到了解决方案。将
WebRequest
转换为
ServletWebRequest
解决了这个问题

((ServletWebRequest)request).getRequest().getRequestURI().toString()

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

此问题有多种解决方案

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

true将显示用户的信息,如客户端id,false将只打印URI

2) 在方法定义中直接使用HttpServletRequest作为

@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);
}
@覆盖
受保护响应HandleHttpMessageGenetradable(HttpMessageGenetradableException ex,
HttpHeaders标头、HttpStatus状态、WebRequest请求、HttpServletRequest(httpRequest){
info(httpRequest.getRequestURI());
返回handleExceptionInternal(例如,errorMessage(HttpStatus.BAD_请求,例如,请求),头,HttpStatus.BAD_请求,请求);
}

ResponseEntityExceptionHandler为@ControllerAdvice类解释了一个方便的基类,这些类希望通过@ExceptionHandler方法跨所有@RequestMapping方法提供集中的异常处理

在Spring Boot 2.1.6中,您可以编写如下内容:

RestExceptionHandler.java

@Order(Ordered.HIGHEST_PRECEDENCE)
@RestControllerAdvice
public class RestExceptionHandler extends ResponseEntityExceptionHandler {
 
private static final Logger logger = LoggerFactory.getLogger(RestExceptionHandler.class);

@ExceptionHandler(ResourceNotFoundException.class)
protected ResponseEntity<Object> handleEntityNotFound(ResourceNotFoundException ex, final HttpServletRequest httpServletRequest) {
    ApiError apiError = new ApiError(HttpStatus.NOT_FOUND);
    apiError.setMessage("Resource not found");
    apiError.setDebugMessage(ex.getMessage());
    apiError.setPath(httpServletRequest.getRequestURI());
    return buildResponseEntity(apiError);
}

private ResponseEntity<Object> buildResponseEntity(ApiError apiError) {
    return new ResponseEntity<>(apiError, apiError.getStatus());
}


 
 @Override
protected ResponseEntity<Object> handleHttpRequestMethodNotSupported(HttpRequestMethodNotSupportedException ex, HttpHeaders headers, HttpStatus status, WebRequest request) {
        ApiError apiError = new ApiError(HttpStatus.METHOD_NOT_ALLOWED);
        apiError.setMessage(ex.getMessage());
        apiError.setPath(((ServletWebRequest)request).getRequest().getRequestURI().toString());
        logger.warn(ex.getMessage());
        return buildResponseEntity(apiError);
}
}
public class ApiError {
// 4xx and 5xx
private HttpStatus status;

@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd'T'HH:mm:ss.SSS'Z'")
private LocalDateTime timestamp;

// holds a user-friendly message about the error.
private String message;

// holds a system message describing the error in more detail.
@JsonInclude(value = Include.NON_EMPTY)
private String debugMessage;

// returns the part of this request's URL
private String path;

@JsonInclude(value = Include.NON_EMPTY)
private List<String> details=new ArrayList<>();

// setters & getters
}
public class ResourceNotFoundException extends RuntimeException {

private static final long serialVersionUID = 1L;

public ResourceNotFoundException() {
    super();
}

public ResourceNotFoundException(String msg) {
    super(msg);
}

访问WebRequest对象的属性:

对象obj=webRequest.getAttribute(“org.springframework.web.util.UrlPathHelper.PATH”,0) 字符串uri=String.valueOf(obj);
webRequest.getAttribute(字符串attributeName,int范围);
//范围可以是:
//0:请求
//第1次会议
//可以通过调用获取有效的属性名称:
字符串[]attributeNames=webRequest.getAttributeNames(0)//范围是请求
有效的属性名称包括:

org.springframework.web.util.UrlPathHelper.PATH
org.springframework.web.context.request.async.WebAsyncManager.WEB_ASYNC_MANAGER
org.springframework.web.servlet.HandlerMapping.bestMatchingHandler
org.springframework.web.servlet.DispatcherServlet.CONTEXT
org.springframework.web.servlet.resource.ResourceUrlProvider
characterEncodingFilter.FILTERED
org.springframework.boot.web.servlet.error.DefaultErrorAttributes.ERROR
org.springframework.web.servlet.DispatcherServlet.THEME_SOURCE
org.springframework.web.servlet.DispatcherServlet.LOCALE_RESOLVER
formContentFilter.FILTERED
org.springframework.web.servlet.HandlerMapping.bestMatchingPattern
requestContextFilter.FILTERED
org.springframework.web.servlet.DispatcherServlet.OUTPUT_FLASH_MAP
org.springframework.web.servlet.HandlerMapping.pathWithinHandlerMapping
org.springframework.web.servlet.DispatcherServlet.FLASH_MAP_MANAGER
org.springframework.web.servlet.HandlerMapping.uriTemplateVariables
org.springframework.web.servlet.DispatcherServlet.THEME_RESOLVER
org.springframework.core.convert.ConversionService

不要使用
getRequestURL()
,而是使用
getRequestURI()
获取问题中的URI。
getRequestURI()
已返回
String
org.springframework.web.util.UrlPathHelper.PATH
org.springframework.web.context.request.async.WebAsyncManager.WEB_ASYNC_MANAGER
org.springframework.web.servlet.HandlerMapping.bestMatchingHandler
org.springframework.web.servlet.DispatcherServlet.CONTEXT
org.springframework.web.servlet.resource.ResourceUrlProvider
characterEncodingFilter.FILTERED
org.springframework.boot.web.servlet.error.DefaultErrorAttributes.ERROR
org.springframework.web.servlet.DispatcherServlet.THEME_SOURCE
org.springframework.web.servlet.DispatcherServlet.LOCALE_RESOLVER
formContentFilter.FILTERED
org.springframework.web.servlet.HandlerMapping.bestMatchingPattern
requestContextFilter.FILTERED
org.springframework.web.servlet.DispatcherServlet.OUTPUT_FLASH_MAP
org.springframework.web.servlet.HandlerMapping.pathWithinHandlerMapping
org.springframework.web.servlet.DispatcherServlet.FLASH_MAP_MANAGER
org.springframework.web.servlet.HandlerMapping.uriTemplateVariables
org.springframework.web.servlet.DispatcherServlet.THEME_RESOLVER
org.springframework.core.convert.ConversionService