SpringBoot项目通用返回值与全局异常处理

SpringBoot项目通用返回值与全局异常处理

目前很多公司开发时候都是前后端分离,后台给前端如果能返回一个统一的格式,统一接口报文格式,开发效率都会大大提升。

定义一个通用返回结果Result类

public class Result<T> {
    private boolean success = true;
    private String errorCode = "0";
    private String errorMsg = null;
    private List<T> data = new ArrayList<>();

    public Result() {
    }

    public Result(List<T> data) {
        if (data != null && data.size() > 0) {
            this.data = data;
        }
    }

    public Result(T data) {
        this.data.add(data);
    }

    public boolean isSuccess() {
        return success;
    }

    public void setSuccess(boolean success) {
        this.success = success;
    }

    public String getErrorCode() {
        return errorCode;
    }

    public void setErrorCode(String errorCode) {
        this.errorCode = errorCode;
    }

    public String getErrorMsg() {
        return errorMsg;
    }

    public void setErrorMsg(String errorMsg) {
        this.errorMsg = errorMsg;
    }

    public List<T> getData() {
        return data;
    }

    public void setData(List<T> data) {
        this.data = data;
    }

    @Override
    public String toString() {
        return "Result{" +
                "success=" + success +
                ", errorCode='" + errorCode + '\'' +
                ", errorMsg='" + errorMsg + '\'' +
                ", data=" + data +
                '}';
    }
}

异常类与异常枚举类

public enum MyExceptionEnum {
    REQUESTPARAM_NOTNULL("A001", "请求参数不能为空"),
    SYSTEM_ERROR("-1", "系统异常"),
    DATASOURCE_ERROR("-2", "数据库异常"),
    OTHER_ERROR("-3", "未知异常");

    private String code;
    private String msg;

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

    public String getCode() {
        return code;
    }

    public String getMsg() {
        return msg;
    }

    public static MyExceptionEnum getByCode(String code) {
        if (StringUtils.isEmpty(code)) {
            return null;
        } else {
            MyExceptionEnum[] var1 = values();
            int var2 = var1.length;
            for(int var3 = 0; var3 < var2; ++var3) {
                MyExceptionEnum errorEnum = var1[var3];
                if (errorEnum.getCode().equals(code)) {
                    return errorEnum;
                }
            }
            return null;
        }
    }
}
public class MyException extends RuntimeException{

    private String errorCode;

    private String errorMsg;

    public String getErrorCode() {
        return errorCode;
    }

    public void setErrorCode(String errorCode) {
        this.errorCode = errorCode;
    }

    public String getErrorMsg() {
        return errorMsg;
    }

    public void setErrorMsg(String errorMsg) {
        this.errorMsg = errorMsg;
    }

    public MyException(String errorCode, String errorMsg) {
        super(errorMsg);
        this.errorCode = errorCode;
        this.errorMsg = errorMsg;
    }

    public MyException(String errorCode, String errorMsg, String description) {
        super(errorMsg + description);
        this.errorCode = errorCode;
        this.errorMsg = errorMsg + description;
    }

    public MyException(MyExceptionEnum myExceptionEnum) {
        super(myExceptionEnum.getMsg());
        this.errorCode = myExceptionEnum.getCode();
        this.errorMsg = myExceptionEnum.getMsg();
    }

    public MyException(MyExceptionEnum myExceptionEnum, String description) {
        super(myExceptionEnum.getMsg() + description);
        this.errorCode = myExceptionEnum.getCode();
        this.errorMsg = myExceptionEnum.getMsg() + description;
    }
}

全局异常处理

@RestControllerAdvice
public class MyExceptionHandler {

    private Logger logger = LoggerFactory.getLogger(getClass());

    @ExceptionHandler(Exception.class)
    public Object handleException(Exception e, HttpServletRequest request, HttpServletResponse response){

        logger.error("请求:{}发生异常:{}", request.getRequestURI(), e);

        Result result = new Result();
        result.setSuccess(false);
        if (e instanceof MyException) {
            result.setErrorCode(((MyException) e).getErrorCode());
            result.setErrorMsg(((MyException) e).getErrorMsg());
        } else {
            result.setErrorCode(MyExceptionEnum.SYSTEM_ERROR.getCode());
            result.setErrorMsg(MyExceptionEnum.SYSTEM_ERROR.getMsg());
        }

        return result;
    }
}

Controller抛出自定义异常

@RequestMapping(
            value = "test",
            method = RequestMethod.POST)
    public FrogTest test(@RequestBody FrogTest bean) {
        if (bean.getName()  == null) {
            throw new MyException(MyExceptionEnum.REQUESTPARAM_NOTNULL);
        }
        int i = 10/0;
        return bean;
    }

测试
请求bean中name不为null时,返回前端

{
    "success": false,
    "errorCode": "-1",
    "errorMsg": "系统异常",
    "data": []
}

查看日志信息

2018-09-21 10:57:10.041 ERROR 7460 --- [io-10050-exec-3] c.f.m.common.MyExceptionHandler          : 请求:/frog-test/test发生异常:{}

java.lang.ArithmeticException: / by zero
	at com.frog.mybatisplus.controller.FrogTestController.test(FrogTestController.java:77) ~[classes/:na]
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:1.8.0_152]
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[na:1.8.0_152]
	...

请求bean中name为null时

{
    "success": false,
    "errorCode": "A001",
    "errorMsg": "请求参数不能为空",
    "data": []
}
  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值