【黑马程序员SpringBoot2全套视频教程,springboot零基础到项目实战(spring boot2完整版)】
之前我们好像都把增删改查功能做完了

但是吧,绝大多数操作都是我们基于理想状态进行的
直接模拟一个异常
@PostMapping
public R save(@RequestBody Book book) throws Exception {
if (true) {
throw new Exception();
}
return new R(bookService.save(book));
}

重启服务器,使用接口测试工具测试

可以看到,又是一种全新的返回格式【虽然也是JSON】【这就是问题】

【前端痛点!】
修改表现层返回结果的模型类,封装出现异常后对应的信息
package com.dingjiaxiong.controller.utils;
import lombok.Data;
/**
* ClassName: R
* date: 2022/10/17 20:43
*
* @author DingJiaxiong
*/
@Data
public class R {
private Boolean flag;
private Object data;
private String msg;
public R() {
}
public R(Boolean flag) {
this.flag = flag;
}
public R(Boolean flag, Object data) {
this.flag = flag;
this.data = data;
}
public R(Boolean flag, String msg) {
this.flag = flag;
this.msg = msg;
}
public R(String msg) {
this.flag = false;
this.msg = msg;
}
}
处理异常类
package com.dingjiaxiong.controller.utils;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;
/**
* ClassName: ProjectExceptionAdvice
* date: 2022/10/18 10:44
* SpringMVC的异常处理器
* @author DingJiaxiong
*/
@RestControllerAdvice
public class ProjectExceptionAdvice {
//拦截所有的异常信息
@ExceptionHandler
public R doException(Exception ex){
//这里面可以做的事情就多了 1. 记录日志 2. 发送消息给运维 3. 发送邮件给开发人员
ex.printStackTrace();
return new R("服务器故障,请稍后再试!");
}
}
重启服务器,测试

这样就又统一了

这个注解中可以添加想要拦截的异常类型

这个就是基类了【这个的意义在于,可以多写几个方法来处理不同类型的异常】
没有传递消息加载默认消息,传递消息后加载指定消息

当然还有问题
咱们正常的操作还没有给msg 值

一会儿老师应该要加

改一下接口
先测试吧

这样就达到异常处理的效果了
完善一下controller 的返回值
@PostMapping
public R save(@RequestBody Book book) throws Exception {
if (book.getName().equals("123")) {
throw new Exception();
}
boolean flag = bookService.save(book);
return new R(flag, flag ? "添加成功^_^" : "添加失败-_-!");
}
修改前端

重启服务器,测试新增

这是异常情况

添加成功,OK
回顾一下
对异常进行统一处理,出现异常后,返回指定信息
@RestControllerAdvice
public class ProjectExceptionAdvice {
@ExceptionHandler(Exception.class)
public R doOtherException(Exception ex){
//记录日志
//发送消息给运维
//发送邮件给开发人员,ex对象发送给开发人员
ex.printStackTrace();
return new R(false,null,"系统错误,请稍后再试!");
}
}
修改表现层返回结果的模型类,封装出现异常后对应的信息
@Data
public class R{
private Boolean flag;
private Object data;
private String msg;
public R(Boolean flag,Object data,String msg){
this.flag = flag;
this.data = data;
this.msg = msg;
}
}
页面消息处理,没有传递消息加载默认消息,传递消息后加载指定消息
//添加
handleAdd () {
//发送ajax请求
axios.post("/books",this.formData).then((res)=>{
//如果操作成功,关闭弹层,显示数据
if(res.data.flag){
this.dialogFormVisible = false;
this.$message.success("添加成功");
}else {
this.$message.error(res.data.msg);
}
}).finally(()=>{
this.getAll();
});
},
在表现层Controller中进行消息统一处理
@PostMapping
public R save(@RequestBody Book book) throws IOException {
Boolean flag = bookService.insert(book);
return new R(flag , flag ? "添加成功^_^" : "添加失败-_-!");
}
页面消息处理
//添加
handleAdd () {
//发送ajax请求
axios.post("/books",this.formData).then((res)=>{
if(res.data.flag){
this.dialogFormVisible = false;
this.$message.success(res.data.msg);
}else {
this.$message.error(res.data.msg);
}
}).finally(()=>{
this.getAll();
});
},