Spring Boot默认异常映射到标准HTTP状态代码

时间:2018-05-09 11:10:16

标签: java spring-boot spring-web

我知道可以在Spring Boot中定义自定义异常处理程序,例如映射到HTTP 400错误请求的IllegalArgumentException异常。我想知道Spring Web / Boot中定义的任何现有异常是否映射到标准HTTP状态代码?这样我就可以抛出它们,它们将自动映射到标准的HTTP状态代码。

2 个答案:

答案 0 :(得分:3)

实际上,ResponseEntityExceptionHandler默认情况下会将Spring内部抛出的异常转换为HTTP状态代码。但是,将异常转换为HTTP状态代码不会提供有关异常的任何重要日志。良好的安全实践要求外部调度的错误消息对系统内部的信息最少。相反,日志应尽可能提供信息。

此外,ResponseEntityExceptionHandler只处理Spring生成的异常。所有与业务相关的例外必须单独处理。例如,"未找到记录"此类不处理从findSomething(xxx)方法抛出的异常。

以下是如何解决这些缺点的示例:

Spring throwned内部错误 您必须覆盖感兴趣的异常的处理程序,并提供内部日志消息和要返回给调用方的外部错误消息。

@ControllerAdvice是一个注释,它使用声明@ExceptionHandler注释方法的类包装@Component类。简而言之,这些处理程序将包装所有@Component方法。

@ResponseStatus(value=HttpStatus.NOT_FOUND, reason="Record not found") //
public class RecordNotFoundException extends RuntimeException {

    private static final long serialVersionUID = 8857378116992711720L;

    public RecordNotFoundException() {
        super();
    }

    public RecordNotFoundException(String message) {
        super(message);
    }
}

业务层抛出错误

您必须首先为每个异常创建一个特定的RuntimeException类,并注释它@ResponseStatus。

@Slf4j
@ControllerAdvice
public class ClientExceptionHandler {

    @ExceptionHandler(value = RecordNotFoundException.class)
    public ResponseEntity<String> handleRecordNotFoundException(
            RecordNotFoundException e,
            WebRequest request) {

        LogError logging = new LogError("RecordNotFoundException",
                HttpStatus.NOT_FOUND, 
                request.getDescription(true));
        log.info(logging.toJson());

        HttpErrorResponse response = new HttpErrorResponse(logging.getStatus(), e.getMessage());
        return new ResponseEntity<>(response.toJson(),
                HeaderFactory.getErrorHeaders(),
                response.getStatus());
    }
   ....
}

然后,您创建一个@ControllerAdvice注释类,它将包含所有这些异常处理程序方法。没有类派生,因为这些@ExceptionHandler注释方法的内部重定向由Spring管理。

{{1}}

最后,帮助程序类LogError和HttpErrorResponse是各自目标的简单格式化程序。

希望这有帮助。

杰克

答案 1 :(得分:2)

有一些例如映射到405的HttpRequestMethodNotSupportedException

查看ResponseEntityExceptionHandler.handleException()方法,该方法定义了处理Spring MVC中常见异常的基本规则。你会发现

NoSuchRequestHandlingMethodException.class,
HttpRequestMethodNotSupportedException.class,
HttpMediaTypeNotSupportedException.class,
HttpMediaTypeNotAcceptableException.class,
MissingPathVariableException.class,
MissingServletRequestParameterException.class,
ServletRequestBindingException.class,
ConversionNotSupportedException.class,
TypeMismatchException.class,
HttpMessageNotReadableException.class,
HttpMessageNotWritableException.class,
MethodArgumentNotValidException.class,
MissingServletRequestPartException.class,
BindException.class,
NoHandlerFoundException.class,
AsyncRequestTimeoutException.class