【springboot+MyBatisPlus】用“异常处理器“捕获解决“数据库信息录入重复“的问题“SQLIntegrityConstraintViolationException“

前言 

当我们编写后端时,会遇到一个问题,那就是:假如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”

我已经将每句代码的功能加上了注释说明!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值