在我们做spring boot项目中,往往会遇到前端接受后台的数据看不懂,格式乱,这也导致了前后端分离时,前端人员不理解后台传过来的错误数据,对此我们提出两种方案:
-
所有的数据、格式由前端写好。
- 由后端人员提前处理好,发送到前端。
那么我们来说一下第二种方式如何实现:
一、首先在表现层中定义Result类
public class Result {
private Object data;//数据
private Integer code;//状态码
private String msg;//消息
public Result() {
}
public Result(Object data, Integer code, String msg) {
this.data = data;
this.code = code;
this.msg = msg;
}
public Result(Object data, Integer code) {
this.data = data;
this.code = code;
}
public Object getData() {
return data;
}
public void setData(Object data) {
this.data = data;
}
public Integer getCode() {
return code;
}
public void setCode(Integer code) {
this.code = code;
}
public String getMsg() {
return msg;
}
public void setMsg(String msg) {
this.msg = msg;
}
}
二、创建ProjectExceptionAdvice类,这里使用了AOP编程(切面编程)
@RestControllerAdvice
public class ProjectExceptionAdvice {
//ExceptiponHandler()里面填写异常类型
@ExceptionHandler(SystemException.class)//系统异常
public Result doSystemException(SystemException ex){
//记录日志
//发送邮件给开发人员
//发送短信给运维人员
return new Result(null,ex.getCode(),ex.getMessage());
}
@ExceptionHandler(BusinessException.class)//业务异常
public Result doBusinessException(BusinessException ex){
return new Result(null,ex.getCode(),ex.getMessage());
}
@ExceptionHandler(Exception.class)//其他异常
public Result doException(Exception e){
//记录日志
//发送邮件给开发人员
//发送短信给运维人员
e.printStackTrace();
return new Result(666,666,"出异常了");
}
}
通过这样的方式,我们就可以在前端看到后台异常传过来的数据。
当然,我们也要定义表现层返回的信息提示,做法如下:
创建Code类:
public class Code {
public static final Integer SAVE_OK = 20011;
public static final Integer DELETE_OK = 20021;
public static final Integer UPDATE_OK = 20031;
public static final Integer GET_OK = 20041;
public static final Integer SAVE_ERR = 20010;
public static final Integer DELETE_ERR = 20020;
public static final Integer UPDATE_ERR = 20030;
public static final Integer GET_ERR = 20040;
public static final Integer BUSINESS_ERR = 50000;
public static final Integer SYSTEM_UNKNOWN_ERR = 500001;
public static final Integer SYSTEM_TIMEOUT_ERR = 500002;
}
这里面是我定义的增删改查以及业务、系统等异常的状态码。
在Controller中去实现:
举例:
//新增
@PostMapping
public Result save(@RequestBody Book book) {
boolean flag = bookService.save(book);
return new Result(flag,flag?Code.SAVE_OK :Code.SAVE_ERR);
}
//根据id查询
@GetMapping("/{id}")
public Result getById(@PathVariable Integer id) {
Book book = bookService.getById(id);
Integer code = book != null ?Code.GET_OK :Code.GET_ERR;
String msg = book != null ?"" : "数据查询失败,请重试!";
return new Result(book,code,msg);
}
以上就是对前后端数据交互的解决方法。