对于当前系统中的所有报错,不让他进行跳转到404或500这种界面,而是把报错信息进行截取,可以对于一些固定的报错进行拦截,并返回相应错误信息
//全局的异常捕获器 //对于所有的加了 restController的方法全部进行配置 @ControllerAdvice(annotations = {RestController.class, Controller.class}) @ResponseBody @Slf4j public class GlobalExceptionHandler { // 只要产生了关于sql语句的异常,那么该方法就会运行 @ExceptionHandler(SQLIntegrityConstraintViolationException.class) public R<String> exceptionHandler(SQLIntegrityConstraintViolationException ex) { log.error(ex.getMessage()); // 对于异常信息进行判断是否有关键字 if (ex.getMessage().contains("Duplicate entry")) { // 报错信息 Duplicate entry 'zhangsan' for key 'idx_username' String[] split = ex.getMessage().split(" "); // 根据空格找回重复信息 String msg = split[2] + "已存在"; // 返回报错信息 return R.error(msg); } return R.error("失败了"); } }
1.如果想要使用先要创建一个 全局异常补货器类,并给他加上@ControllerAdvice这个注解
(@ControllerAdvice是一个spring的AOP )
2.在该全局捕获器中,定义一个异常处理器函数给他加上注解,并配置上SQL语句重复的异常类
@ExceptionHandler(SQLIntegrityConstraintViolationException.class)
3.上面设置的是一个在添加员工的时候出现的一个SQL语句错误,说的是添加重复
// 报错信息 Duplicate entry 'zhangsan' for key 'idx_username'
4.因为前端需要回显报错信息,所以这里将报错Message抓取,并通过split方法将其中的重复信息截取出来,并将其中的信息拼接并回显到前端
因为数据库中的employee表中username键设置为unique所以需要进行这个配置