SpringBoot+MyBatis+MySql从头到尾完成一个电商项目(四、通用返回对象的编写)

企业级接口的返回对象一般都是status+data的形式,即接口是否返回成功,以及接口返回的数据是什么,这里我们来定义一下通用的通用对象返回的格式。

1、首先在码云新建一个分支,common-api,然后在本地拉取代码,这部分内容前面讲过,这里就省略了。

2、我们新建一个package名字为response,包下面新建一个CommonReturnType的类,用来定义通用返回对象。如下图:

SpringBoot+MyBatis+MySql从头到尾完成一个电商项目(四、通用返回对象的编写)

下面我们来看一下这个CommonReturnType的内容:

//处理接口返回数据类型,使用status和data的格式返回数据
public class CommonReturnType {

    //请求结果,success和fail
    private String status;

    //若status=success,则data内返回前端需要的json数据
    //若status=fail,则data内使用通用的错误码格式
    private Object data;

    //定义一个通用的创建方法
    public static CommonReturnType creat(Object result){
        return CommonReturnType.creat(result,"success");
    }

    //使用了函数重载的方式做了一个构造方法
    public static CommonReturnType creat(Object result,String status){
        CommonReturnType type=new CommonReturnType();
        type.setStatus(status);
        type.setData(result);
        return type;
    }


    public String getStatus() {
        return status;
    }

    public void setStatus(String status) {
        this.status = status;
    }

    public Object getData() {
        return data;
    }

    public void setData(Object data) {
        this.data = data;
    }
}

这个方法是说当Controller完成相应的逻辑以后调用creat方法,如果不带status参数米那就默认status的参数是“success”,然后创建了对应的CommonReturnType,并且把值返回。下面我们来看一下如何在Controller中使用这个CommonReturnTYpe。

3、使用CommonReturnType

SpringBoot+MyBatis+MySql从头到尾完成一个电商项目(四、通用返回对象的编写)

由上图可知,我们在Controller中做了下面的改变:

我们不再返回UserVO对象,而是返回了一个通用的返回对象CommonReturnType,然后在最后返回的时候使用了return CommonReturnType.creat(userVO)的方法将UserVO对象返回,这里在使用creat方法时,没有加status方法,默认是返回成功“success”。现在我们可以来调试一把我们的程序:

SpringBoot+MyBatis+MySql从头到尾完成一个电商项目(四、通用返回对象的编写)

这样我们返回给前端的数据格式就非常规范了,前端的人员也比较好拿到我们返回给他们的数据了。

4、下面我们做一下对异常的处理,即status为fail的时候的处理。

首先我们新建一个error的package,然后在这个包下面新建一个CommonError的接口如下图:

SpringBoot+MyBatis+MySql从头到尾完成一个电商项目(四、通用返回对象的编写)

为什么我们要使用interface的形式,我待会会解释这一点,下面我们来看一下CommonError里面的内容:

SpringBoot+MyBatis+MySql从头到尾完成一个电商项目(四、通用返回对象的编写)

我们定义了三个方法,分别为获取错误码,获取错误信息和设置错误信息。下面我们再新建一个枚举去实现这些方法如下图:

SpringBoot+MyBatis+MySql从头到尾完成一个电商项目(四、通用返回对象的编写)

下面我们来定义一些常见的错误类型:

SpringBoot+MyBatis+MySql从头到尾完成一个电商项目(四、通用返回对象的编写)

这里我们定义二零用户不存在和参数不合法两个错误类型,然后在下面的get、set方法中也要改变一下:

SpringBoot+MyBatis+MySql从头到尾完成一个电商项目(四、通用返回对象的编写)

下面我们来看一下具体怎么使用这个通用的错误枚举!

5、我们采用抛出异常的形式使用这些通用错误的返回类型,首先新建一个BusinessException,并实现CommonError的方法如下图:

SpringBoot+MyBatis+MySql从头到尾完成一个电商项目(四、通用返回对象的编写)

然后新建一个构造函数如下图:

SpringBoot+MyBatis+MySql从头到尾完成一个电商项目(四、通用返回对象的编写)

最后改写相应的get、set方法如下:

SpringBoot+MyBatis+MySql从头到尾完成一个电商项目(四、通用返回对象的编写)

我们的这种逻辑有一个专门的名字叫做包装器业务异常类实现,就是说BusinessException和我们刚才定义的EmBusinessError,都共同继承了CommonError的方法,使外部可以通过new一个BusinessException或者new一个EmBusinessError的形式都可以获得errorCode和errMsg的内容。说了那么多,下面我们来实践一下:

6、我们在Controller层中这样改变,然后抛出错误异常如下:

SpringBoot+MyBatis+MySql从头到尾完成一个电商项目(四、通用返回对象的编写)

下面我们对抛出的异常做一下处理:

我们在controller包下面新建一个BaseController,把一些异常放入这里面如下图:

/**
 * @Author: MaHuadong
 * @Date: 2019/4/2 15:27
 * @Version 1.0
 * 把异常处理逻辑放到基类controller里面
 * 别的controller只需要继承BaseController即可
 */
public class BaseController {

    //定义Exceptionhandle解决未被controller层吸收的exception
    @ExceptionHandler(Exception.class)
    //即便controller抛出异常,我们捕获它然后正常返回200的值
    @ResponseStatus(HttpStatus.OK)
    //接收HttpServletRequest和异常Exception,只能返回一个页面路径,若想返回对象,则需要加上下面的注解
    @ResponseBody
    public Object handleException(HttpServletRequest request, Exception ex){

        Map<String, Object> responseData = new HashMap<>();
        //如果ex返回的是BusinessException,则把Exception强转为BusinessException
        if (ex instanceof BusinessException) {
            BusinessException businessException = (BusinessException) ex;

            //使用Map存放errCode和errMsg
            responseData.put("errCode", businessException.getErrorCode());
            responseData.put("errMsg", businessException.getErrorMsg());
        }else {
            //如果ex返回的是不BusinessException,则直接输出未知错误,我们需要去枚举里面再定义一个未知错误然后返回
            //使用Map存放errCode和errMsg
            responseData.put("errCode", EmBusinessError.UNKNOW_ERROR.getErrorCode());
            responseData.put("errMsg",EmBusinessError.UNKNOW_ERROR.getErrorMsg());
        }
        //使用构造函数返回data和status
        return CommonReturnType.creat(responseData,"fail");

    }
}

下面我们来测试一下,

SpringBoot+MyBatis+MySql从头到尾完成一个电商项目(四、通用返回对象的编写)

上面我们在controller中加入上面的代码,我们能看到明显的逻辑错误,我们来看一下能返回什么错误:

SpringBoot+MyBatis+MySql从头到尾完成一个电商项目(四、通用返回对象的编写)

这里按照我们在EmBusinessError中定义的位置错误:

SpringBoot+MyBatis+MySql从头到尾完成一个电商项目(四、通用返回对象的编写)

再换个参数测试一下:

SpringBoot+MyBatis+MySql从头到尾完成一个电商项目(四、通用返回对象的编写)

这里我们抛出一个用户不存在的异常,然后运行看一下:

SpringBoot+MyBatis+MySql从头到尾完成一个电商项目(四、通用返回对象的编写)

也可以成功返回!说明咱们做的没问题!

到现在咱们的通用返回对象就已经编写完成了,并且测试成功了,现在咱们把代码提交一下,然后进行下一步的开发。

git add .

git commit -m 'common-api'

git push

然后再合并到主分支:

git checkout master

git merge origin/common-api

git push

好了,通用接口返回对象的编写就到这儿了,加油!