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

  • Post author:
  • Post category:vue


本章结束后对应的节选代码文件:

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

在这里插入图片描述



版权声明:本文为qq_37132495原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。