Spring REST 异常处理之全局处理

本文介绍如何在REST系统中实现异常信息的全局处理。通过继承`ResponseEntityExceptionHandler`类并覆盖其方法,不仅可以处理内置异常,还能自定义异常响应。文章提供了具体的示例代码,并展示了如何针对不同类型的异常设置错误码及消息。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

  • 首先,我们看一下spring framework官方文档关于这一点的介绍
    这里写图片描述
    可以看到,文档讲的非常简单。对于初学者,可能直接就忽略了。但是,结合博主的其他几篇文章(文末有链接),我们还是可以搞清楚它讲的是什么的。从它的介绍可以看出,使用该种方式,我们可以方便地定义异常消息的内容、自定义异常响应体,可以说灵活性非常好。另外,通过继承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),然后在各自的异常处理方法中进行处理。当然,这个例子只是对我们自定义的异常进行捕获,然后设置错误码、设置消息提示,异常处理逻辑并不复杂。在实际应用中,我们可以根据需求实现更复杂的异常处理逻辑。

  • 测试
    这里写图片描述
    这里写图片描述

  • 参考

  1. Spring 异常处理之HTTP状态码
  2. Spring 异常处理之本地处理
  3. Spring 异常处理之全局处理
  4. Spring REST 异常处理之本地处理
  5. Spring REST 异常处理之全局处理
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

杂货铺的小掌柜

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值