我们现在已经完成了员工管理和部门管理两个功能接口,但是此时我们发现如果前端编辑员工或部门时发生了错误,比如用户名重复,手机号重复这些,那么前端是收不到提示的,此时我们要解决这个问题。
我们要新建一个异常包和一个处理异常的类,此时需要用到两个新的注解,分别为:
@RestControllerAdvice:
@ExceptionHandler:
package com.itheima.exception;
import com.itheima.pojo.Result;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;
@Slf4j
@RestControllerAdvice
public class GlobalExceptionHandler {
@ExceptionHandler
public Result ExceptionHandler1(Exception e){
log.info("程序出错啦!", e);
return Result.error("出错了,请联系管理员");
}
}
这样的话前端的数据出现错误时,就会直接在前端页面上收到反馈
下一步我的目标是让这个出错信息更具体,比如我现在手机号重复了,那么就要直接提示是手机号重复的问题。
我们先在 idea 的控制台中找到这一句话
Caused by: java.sql.SQLIntegrityConstraintViolationException: Duplicate entry '18809091212' for key 'emp.phone'
意思很简单啊,就是说这个号码重复了,那么我就专门新建一个方法用来处理这个异常
这里接收的异常参数和上面不一样就是专门处理 Duplicate 的参数,还有一些简单的算法步骤如下:
@ExceptionHandler
public Result EceptionHandler2(DuplicateKeyException e){
log.info("“程序出错啦:", e);
//1:首先把这个异常语句转化成 string 提取出来
String s = e.getMessage();
//2:找到我们需要的那句异常
int idx = s.indexOf("Duplicate entry");
//3:讲这句话提取出来
String ss = s.substring(idx);
//4:将这句话进行划分,找到我们需要的哪个号码
String[] arr = ss.split(" "); // 很明显是按照空格进行划分
//5:输出我们需要的信息
return Result.error("号码重复了: " + arr[2]);
}
那么这时候可能有人会问:如果出现了 Duplicate 型的异常,到底是匹配第一种方法,还是第二种方法呢?因为第一种方法显然也包含了第二种方法啊。
我们打开这个参数类的可视化图;
我们可以看到,这种匹配就是从下往上匹配的,如果在下面匹配到了,就不用往上跑了。