SpringBoot+MyBatis+MySql从头到尾完成一个电商项目(四、通用返回对象的编写)
企业级接口的返回对象一般都是status+data的形式,即接口是否返回成功,以及接口返回的数据是什么,这里我们来定义一下通用的通用对象返回的格式。
1、首先在码云新建一个分支,common-api,然后在本地拉取代码,这部分内容前面讲过,这里就省略了。
2、我们新建一个package名字为response,包下面新建一个CommonReturnType的类,用来定义通用返回对象。如下图:
下面我们来看一下这个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
由上图可知,我们在Controller中做了下面的改变:
我们不再返回UserVO对象,而是返回了一个通用的返回对象CommonReturnType,然后在最后返回的时候使用了return CommonReturnType.creat(userVO)的方法将UserVO对象返回,这里在使用creat方法时,没有加status方法,默认是返回成功“success”。现在我们可以来调试一把我们的程序:
这样我们返回给前端的数据格式就非常规范了,前端的人员也比较好拿到我们返回给他们的数据了。
4、下面我们做一下对异常的处理,即status为fail的时候的处理。
首先我们新建一个error的package,然后在这个包下面新建一个CommonError的接口如下图:
为什么我们要使用interface的形式,我待会会解释这一点,下面我们来看一下CommonError里面的内容:
我们定义了三个方法,分别为获取错误码,获取错误信息和设置错误信息。下面我们再新建一个枚举去实现这些方法如下图:
下面我们来定义一些常见的错误类型:
这里我们定义二零用户不存在和参数不合法两个错误类型,然后在下面的get、set方法中也要改变一下:
下面我们来看一下具体怎么使用这个通用的错误枚举!
5、我们采用抛出异常的形式使用这些通用错误的返回类型,首先新建一个BusinessException,并实现CommonError的方法如下图:
然后新建一个构造函数如下图:
最后改写相应的get、set方法如下:
我们的这种逻辑有一个专门的名字叫做包装器业务异常类实现,就是说BusinessException和我们刚才定义的EmBusinessError,都共同继承了CommonError的方法,使外部可以通过new一个BusinessException或者new一个EmBusinessError的形式都可以获得errorCode和errMsg的内容。说了那么多,下面我们来实践一下:
6、我们在Controller层中这样改变,然后抛出错误异常如下:
下面我们对抛出的异常做一下处理:
我们在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"); } }
下面我们来测试一下,
上面我们在controller中加入上面的代码,我们能看到明显的逻辑错误,我们来看一下能返回什么错误:
这里按照我们在EmBusinessError中定义的位置错误:
再换个参数测试一下:
这里我们抛出一个用户不存在的异常,然后运行看一下:
也可以成功返回!说明咱们做的没问题!
到现在咱们的通用返回对象就已经编写完成了,并且测试成功了,现在咱们把代码提交一下,然后进行下一步的开发。
git add .
git commit -m 'common-api'
git push
然后再合并到主分支:
git checkout master
git merge origin/common-api
git push
好了,通用接口返回对象的编写就到这儿了,加油!