前言
当我们编写后端时,会遇到一个问题,那就是:假如A用户向我们的数据库录入完登录信息后(姓名,账号等),B用户同样采用了一个相同的姓名提交了登录信息,那这个时候就不满足username的唯一约束,此时数据库就会报错
例如报错如下:
Duplicate entry '····' for key '····'
提示我们用户名已存在
那么我们可以采用一个较为便捷的方法:异常处理器来捕获重复的信息,拦截到错误请求后,提示用户更改用户名再重新注册。
方法
我们需要新建一个包 用来编写用于捕获全局的异常的处理器
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.*;
import java.sql.SQLIntegrityConstraintViolationException;
/**
* 全局异常处理
*/
@ControllerAdvice(annotations = {RestController.class, Controller.class})//对所有加了RestController注解和Controller注解的类进行拦截操作
@ResponseBody
@Slf4j
public class GlobalExceptionHandler {
/**
* 异常处理方法
* @return
*/
@ExceptionHandler(SQLIntegrityConstraintViolationException.class)//拦截包含SQLIntegrityConstraintViolationException的异常
public R<String> exceptionHandler(SQLIntegrityConstraintViolationException ex){
log.error(ex.getMessage());//将报错信息打印到控制台看看报的是什么错误"Duplicate entry '用户名字' for key '数据库里的名字'"
if (ex.getMessage().contains("Duplicate entry")){//如果抛出的是Duplicate entry开头的错误的话
String[] split = ex.getMessage().split("");//根据空格找到用户的名称
String msg = split[2] + "已存在";//拿到用户名称并在后面加上"已存在"的提示
return R.error(msg);//将msg传到error里面,以便于报错后提示给客户端
}
return R.error("未知错误");//如果不是Duplicate entry开头的错误,直接返回一个未知错误就好了
}
}
· @ControllerAdvice(annotations = {RestController.class, Controller.class})
ControllerAdvice注解中的字段annotations声明了需要捕获哪些的类(类上加了RestController和Controller注解的类)
· @ExceptionHandler(SQLIntegrityConstraintViolationException.class)
这个注解定义了需要处理哪些异常,例如“SQLIntegrityConstraintViolationException”
我已经将每句代码的功能加上了注释说明!