SpringBoot + Vue前后端分离开发:全局异常处理及统一结果封装
前后端分离开发中的异常处理
在我们的前后端分离项目中,有时候不可避免发生后端服务报错抛出异常的情况,如果不配置全局异常处理机制,就会默认返回tomcat或者nginx的5XX页面,对普通用户来说,不太友好,用户也不懂什么情况。这时候需要我们程序员设计返回一个友好简单的格式给前端,然后再由前端给用户返回能够使其理解的报错信息,而不是抛一个java exception给用户。
后端给前端返回错误信息,前端需要能接收到此错误信息并告知用户,也即前端也需要进行异常处理,在Vue项目中,前端都是用axios向后端发送请求,前端需要配置全局axios拦截器,拦截后端给我们返回的http response,判断请求是否成功,失败的话则返回相应错误信息
在上述前后端交互的过程中,有必要统一一个结果返回封装类,这样前后端交互的时候有个统一的标准,约定结果返回的数据是正常的或者遇到异常了。否则后端返回的数据五花八门,前端也无法判断请求是否成功了
统一结果封装
统一结果封装是由前后端协商共同确定的,对于不同的项目可能封装类不同。
在此我们用一个简单的统一结果封装类来演示这个前后端交互的重要环节。一般来说,统一结果封装类里面有几个要素必要的:
- 请求是否成功,可用code表示(如200表示成功,400表示异常)
- 请求结果消息message
- 请求结果数据data
这里我们用一个Result类来表示统一结果封装类,那么Result类里肯定有以下三个属性了:
Result里应该有哪些方法呢?请求只有成功和失败两种情况,Result里应定义静态方法,用以生成Result对象返回给前端,参数即为Result对象的3个属性,于是我们定义以下两个方法:
光有这两个方法还不够,因为这两个方法并不是特别方便使用。对于大部分请求成功的情况,code就是200,请求成功的message其实并不重要,data才是前端需要的,也就是说,在大部分请求成功的情况下,我们只要把data传给前端就行,创建Result的方法,参数只要一个,那就是data,code直接为200,message为操作成功就行。于是我们定义一个succ的重载方法,能让我们更方便的使用结果封装:
对于大部分请求失败的情况也是一样,一般请求失败时,后端都不会向前端返回data,请求失败时异常的报错信息message才是前端需要的,code也可以直接定义为400,因为400代表http中的bad request,即请求失败。于是我们定义一个fail的重载方法:
此时,统一结果封装类我们就定义完成了,它的完整代码如下:
@Data
public class Result implements Serializable {
private int code;
private String msg;
private Object data;
public static Result succ(Object data) {
return succ(200, "操作成功", data);
}
public static Result fail(String msg) {
return fail(400, msg, null);
}
public static Result succ (int code, String msg, Object data) {
Result result = new Result();
result.setCode(code);
result.setMsg(msg);
result.set