丢失标头的截获@RequestHeader异常

2022-09-04 05:52:32

我在控制器中有一个方法,例如具有参数

@RequestMapping(value = "/{blabla}", method = RequestMethod.POST)
@ResponseStatus(HttpStatus.CREATED)
public void post(@RequestHeader("ETag") int etag)

如果请求中没有ETag标头 - 客户端获得400(BAD_REQUEST),这没有任何信息。我需要以某种方式处理此异常并将我自己的异常发送到客户端(我为此使用JSON)。我知道我可以通过@ExceptionHandler拦截异常,但在这种情况下,将处理所有HTTP 400请求,但我希望标头中缺少ETag。有什么想法吗?


答案 1

您也可以通过使用弹簧注释来实现此目的。@ControllerAdvice

@ControllerAdvice
public class ExceptionHandler extends ResponseEntityExceptionHandler{

    /**
     * Handle ServletRequestBindingException. Triggered when a 'required' request
     * header parameter is missing.
     *
     * @param ex      ServletRequestBindingException
     * @param headers HttpHeaders
     * @param status  HttpStatus
     * @param request WebRequest
     * @return the ResponseEntity object
     */
    @Override
    protected ResponseEntity<Object> handleServletRequestBindingException(ServletRequestBindingException ex,
            HttpHeaders headers, HttpStatus status, WebRequest request) {
        return new ResponseEntity<>(ex.getMessage(), headers, status);
    }

}

在没有所需请求标头的情况下访问 API 时,响应为:

缺少字符串类型方法参数的请求标头“授权”

与此异常一样,您可以自定义所有其他异常。


答案 2

如果Spring版本是5 +,那么您需要处理的确切异常是.如果全局异常处理程序类扩展,则添加 for 将不起作用,因为扩展和后者在 .如果你尝试,你会得到例外。MissingRequestHeaderExceptionResponseEntityExceptionHandler@ExceptionHandlerServletRequestBindingExceptionMissingRequestHeaderExceptionServletRequestBindingExceptionhandleExceptionResponseEntityExceptionHandlerAmbiguous @ExceptionHandler method mapped for ...


推荐