欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Spring REST 异常处理之全局处理

程序员文章站 2022-05-22 09:38:25
...

承接上一篇文章,本文介绍在REST系统中,我们怎样对异常信息做全局处理。这种方式也是我个人使用最多的方式。

  • 首先,我们看一下spring framework官方文档关于这一点的介绍
    Spring REST 异常处理之全局处理
    可以看到,文档讲的非常简单。对于初学者,可能直接就忽略了。但是,结合博主的其他几篇文章(文末有链接),我们还是可以搞清楚它讲的是什么的。从它的介绍可以看出,使用该种方式,我们可以方便地定义异常消息的内容、自定义异常响应体,可以说灵活性非常好。另外,通过继承ResponseEntityExceptionHandler这个类并覆盖其中的方法,我们甚至可以处理spring MVC的标准(内置)异常;除此之外,我们还可以进行扩展,处理我们自定义的异常。

    • 示例代码
@RestControllerAdvice(annotations = RestController.class)
public class RestExceptionHandler extends ResponseEntityExceptionHandler {

    private static Logger logger = LoggerFactory.getLogger(RestExceptionHandler.class);

    /**
     * 非法访问
     * 
     * @param ex 非法访问的异常对象
     * @return 响应体
     */
    @ExceptionHandler(InvalidPermissionException.class)
    public ResponseEntity<ApiResponse<Void>> handleInvalidPermissionException(
            InvalidPermissionException ex) {
        logger.error("操作失败:{}", ex.getMessage());

        // API返回结果
        ApiResponse<Void> apiResponse = new ApiResponse<>(
                ApiResponseCode.CODE_INVALID_PERMISSION.getCode(), ex.getMessage());

        return new ResponseEntity<>(apiResponse, HttpStatus.BAD_REQUEST);
    }

    /**
     * 重复操作
     * 
     * @param ex 重复操作的异常对象
     * @return 响应体
     */
    @ExceptionHandler(DuplicatedOperationException.class)
    public ResponseEntity<ApiResponse<Void>> handleDuplicatedOperationException(
            DuplicatedOperationException ex) {
        logger.error("操作失败:{}", ex.getMessage());

        // API返回结果
        ApiResponse<Void> apiResponse = new ApiResponse<>(
                ApiResponseCode.CODE_DUPLICATED_OPERATION.getCode(), ex.getMessage());

        return new ResponseEntity<>(apiResponse, HttpStatus.BAD_REQUEST);
    }


    /**
     * 其他异常都按照"未知异常"处理
     * 
     * @param e 异常对象
     * @return 响应体
     */
    @ExceptionHandler(Exception.class)
    public ResponseEntity<ApiResponse<Void>> otherException(Exception e) {
        logger.error("操作失败:{}", e);

        ApiResponseCode apiResponseCode = ApiResponseCode.CODE_UNKNOWN;

        // API 返回结果
        ApiResponse<Void> apiResponse = new ApiResponse<>(apiResponseCode);

        return new ResponseEntity<>(apiResponse, HttpStatus.BAD_REQUEST);
    }
}

在上面的例子中,我们实现了自定义异常的处理,通过@ExceptionHandler(结合@RestControllerAdvice)我们捕获自定义的异常(例子中的InvalidPermissionException和DuplicatedOperationException),然后在各自的异常处理方法中进行处理。当然,这个例子只是对我们自定义的异常进行捕获,然后设置错误码、设置消息提示,异常处理逻辑并不复杂。在实际应用中,我们可以根据需求实现更复杂的异常处理逻辑。