从零开始的个人博客设计02--统一返回对象和全局异常处理

项目场景:

统一返回对象和全局异常处理是非常基本的模块,开头先把这里写了,学习了下三更老师的相关设计,和我之前用的这两种模块结合了下。


统一返回类型

import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;

import static com.zyq.enums.StatusCodeEnum.SUCCESS;
import static com.zyq.enums.StatusCodeEnum.FAIL;

@Data
@ApiModel(description = "结果返回类")
public class BaseResult <T> {

    /**
     * 状态码
     */
    @ApiModelProperty(value = "状态码")
    private Integer code;

    /**
     * 返回信息
     */
    @ApiModelProperty(value = "返回信息")
    private String msg;

    /**
     * 返回数据
     */
    @ApiModelProperty(value = "返回数据")
    private T data;

    public static <T> BaseResult<T> success() {
        return buildResult(true, null, SUCCESS.getCode(), SUCCESS.getMsg());
    }

    public static <T> BaseResult<T> success(T data) {
        return buildResult(true, data, SUCCESS.getCode(), SUCCESS.getMsg());
    }

    public static <T> BaseResult<T> fail(String message) {
        return buildResult(false, null, FAIL.getCode(), message);
    }

    public static <T> BaseResult<T> fail(Integer code, String message) {
        return buildResult(false, null, code, message);
    }

    private static <T> BaseResult<T> buildResult(Boolean flag, T data, Integer code, String message) {
        BaseResult<T> r = new BaseResult<>();
        r.setData(data);
        r.setCode(code);
        r.setMsg(message);
        return r;
    }
}

VO优化:

之前我写的项目虽然也想使用VO优化,但是一直用的不太好,理解的不是很透彻,这次学习了以后,相信之后能熟练使用了。

我们在项目中一般最后还要把VO来接受查询出来的结果。一个接口对应一个VO,这样即使接口响应字段要修改也只要改VO即可。
例如:两个接口一个返回热门文章,另一个返回文章的所有类别,虽然他们的实体类都是Article,但是我们依然写两个VO,这两个VO所包含的属性依照需求来设置,这样再加上BeanCopy,当我们一个需求改变时,只需改变其对应的VO,而不用改变另一个。


全局异常处理:

之前我使用的全局异常处理和三更老师的差不多,稍加修改,完成的十分顺利,就不详细赘述了。

在开发过程中可能需要做很多的判断校验,如果出现了非法情况我们是期望响应对应的提示的。但是如果我们每次都自己手动去处理就会非常麻烦。我们可以选择直接抛出异常的方式,然后对异常进行统一处理。把异常中的信息封装成ResponseResult响应给前端。

BlogException异常类:

@Getter
public class BlogException extends RuntimeException{
    private Integer code;
    private String msg;

    public BlogException(BlogErrorInfoEnum errorInfoEnum) {
        super(errorInfoEnum.getMsg());
        this.code = errorInfoEnum.getCode();
        this.msg = errorInfoEnum.getMsg();
    }
}

BlogErrorInfoEnum异常信息枚举类:

@Getter
public enum BlogErrorInfoEnum {
    SUCCESS(2000, "操作成功"),
    TOKEN_EXPIRED(4001, "您的token已过期"),
    NOT_LOGIN(4002, "请先登录再进行访问"),
    RESOURCES_NOT_FOUND(4003, "找不到相应资源"),
    TOKEN_INVALID(4004, "无效的token"),
    NO_AUTHORITY(4005, "对不起,您没有权限访问该接口"),
    INCOMPLETE_PARAMETERS(4006, "请求字段不完整"),
    UN_INIT(4007, "博客尚未初始化"),
    INVALID_ID(4008, "你的id不合法"),
    CHECK_USER_ERR(4009, "用户名或密码错误"),
    UNKNOWN_ERROR(5000, "出现未知错误"),
    FILE_UPLOAD_ERROR(5001, "图片上传失败"),
    FILE_DOWNLOAD_ERROR(5002, "图片下载失败");

    private Integer code;
    private String msg;

    BlogErrorInfoEnum(int code, String msg) {
        this.code = code;
        this.msg = msg;
    }
}

GlobalExceptionhandler全局异常处理类

@RestControllerAdvice
@Slf4j
public class GlobalExceptionHandler {

    @ExceptionHandler(BlogException.class)
    public BaseResult systemExceptionHandler(BlogException e){
        //打印异常信息
        log.error("出现了异常! {}",e);
        //从异常对象中获取提示信息封装返回
        return BaseResult.fail(e.getCode(),e.getMsg());
    }


    @ExceptionHandler(Exception.class)
    public BaseResult exceptionHandler(Exception e){
        //打印异常信息
        log.error("出现了异常! {}",e);
        //从异常对象中获取提示信息封装返回
        return BaseResult.fail(BlogErrorInfoEnum.UNKNOWN_ERROR.getCode(),e.getMessage());
    }
}

说在最后

安全申明:本人才疏学浅,若有任何谬误,欢迎指正

我的博客:ひかりの博客
csdn主页:csdn博客主页

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值