从零搭建若依(Ruoyi-Vue)管理系统(8)--统一对象返回和错误处理

本章结束后对应的节选代码文件:Gangbb-Vue-08-ResAndException

项目地址:https://github.com/Gang-bb/Gangbb-Vue
历史遗留TODO:

  • 第四章
  1. 登录日志还未实现。(到登录和权限模块完成)
  2. LogAspect从缓存获取当前的用户信息使用模拟的数据(到登录和权限模块完成)

本章将留下TODO:

本章将解决TODO:

这章节若依讲得还算清楚,不过也不难。大概的具体思路就是:

  1. 定义一个统一返回对象ApiRestResponse(若依中是AjaxResult),用来统一请求成功和请求失败返回的json信息。
  2. 在我们的应用中给我们希望一些异常情况,抛出时为我们自定义的异常ApiException,有自己的状态码和自定义message,这样方便排错和易于管理。
  3. 全局异常处理GlobalExceptionHandler,拦截你想拦截的异常,并调用返回ApiRestResponse

1. 定义统一返回对象

若依中是AjaxResult类。

/**
 * @author : Gangbb
 * @ClassName : ApiRestResponse
 * @Description : 统一结果返回
 * @Date : 2021/3/9 19:35
 */

public class ApiRestResponse extends LinkedHashMap<String, Object>
{
    private static final long serialVersionUID = 1L;


    /** 系统自定义状态码 */
    public static final String CODE = "code";

    /** 返回信息 */
    public static final String MSG_TAG = "msg";

    /** 数据对象 */
    public static final String DATA_TAG = "data";

    /** 请求url */
    public static final String REQUEST_TAG = "request";

    /** 系统成功 默认code 20000 */
    public static final String SYSTEM_SUCCESS = "20000";

    /** 系统默认异常 默认code 50000 */
    public static final String SYSTEM_FAIL = "B0001";


    /**
     * 初始化一个新创建的 ApiRestResponse 对象(成功时使用)
     *
     * @param code 状态码
     * @param msg 返回内容
     * @param data 数据对象
     */
    public ApiRestResponse(String code, String msg, Object data)
    {
        super.put(CODE, code);
        super.put(MSG_TAG, msg);
        if (StringUtils.isNotNull(data))
        {
            super.put(DATA_TAG, data);
        }
    }

    /**
     * exception专用返回(错误时使用)
     * @param code 系统自定义状态码
     * @param msg 错误信息
     */
    public ApiRestResponse(String code, String msg)
    {

        super.put(CODE, code);
        super.put(MSG_TAG, msg);
        super.put(REQUEST_TAG, ServletUtils.getRequest().getRequestURI());
    }


    /**
     * 返回成功数据
     *
     * @return 成功消息
     */
    public static ApiRestResponse success()
    {
        return ApiRestResponse.success(null);
    }

    /**
     * 返回成功数据
     *
     * @return 成功消息
     */
    public static ApiRestResponse success(Object data)
    {
        String message = "操作成功(success)";
        return new ApiRestResponse(SYSTEM_SUCCESS, message, data);
    }



    /**
     *  返回错误消息
     * @param code 错误信息
     * @return
     */
    public static ApiRestResponse error(String code)
    {
        return new ApiRestResponse(code, MessageUtils.getMessageByCode(code));
    }

    /**
     * 返回错误消息
     * @param code 系统自定义状态码
     * @param msg 错误信息
     * @return
     */
    public static ApiRestResponse error(String code, String msg)
    {
        return new ApiRestResponse(code, msg);
    }


}

2. 自定义异常类及错误码规范

若依中的实现是,按几个大类根据相应场景有不同的自定义异常,个人不太喜欢这种实现方案,感觉很繁琐,日后有点难维护!如图:

在这里插入图片描述

我自己的实现思路是只定义一个自定义异常类,抛出时传入不同的状态码 ,通过不同状态码获取到messages.properties中的不同错误信息,只要对状态码有一个统一定义规范就能有效区分不同异常进行管理

此处用阿里巴巴定义状态码的思想,感觉还不错:

image-20210310074415015

2.1 自定义异常类ApiException

若依中是BaseException

public class ApiException extends RuntimeException
{
    private static final long serialVersionUID = 1L;

    /**
     * 错误码
     */
    private String code;


    /**
     * 错误消息
     */
    private String message;


    public ApiException(String code, String message)
    {
        this.code = code;
        this.message = message;
    }

    public ApiException(String code)
    {
        this(code, MessageUtils.getMessageByCode(code));
    }



    public String getCode() {
        return code;
    }

    public void setCode(String code) {
        this.code = code;
    }

    @Override
    public String getMessage() {
        return message;
    }

    public void setMessage(String message) {
        this.message = message;
    }
}

2.2 错误状态码示例

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

3. 全局异常处理

暂时先捕捉这几个异常日后有什么再补上

@RestControllerAdvice
public class GlobalExceptionHandler {

    private static final Logger log = LoggerFactory.getLogger(GlobalExceptionHandler.class);

    /**
     * 自定义异常捕捉
     */
    @ExceptionHandler(ApiException.class)
    public ApiRestResponse baseException(ApiException e)
    {
        return ApiRestResponse.error(e.getCode(), e.getMessage());
    }

    /**
     * 基础异常捕捉
     */
    @ExceptionHandler(Exception.class)
    public ApiRestResponse exception(Exception e)
    {
        log.error("Exception: ", e);
        return ApiRestResponse.error(e.getMessage());
    }

}

4. 测试

本节所有测试例子都在TestExceptionController

成功示例:

在这里插入图片描述

异常示例:

image-20210310090158982

在这里插入图片描述

  • 3
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 5
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值