首页 > 其他分享 >全局异常处理解决重复添加同一用户-cnblog

全局异常处理解决重复添加同一用户-cnblog

时间:2023-02-04 17:00:49浏览次数:47  
标签:springframework Controller 添加 处理器 import 全局 异常 cnblog

2.6 全局异常处理

2.6.1 思路分析

要想解决上述测试中存在的问题,我们需要对程序中可能出现的异常进行捕获,通常有两种处理方式:

A. 在Controller方法中加入 try...catch 进行异常捕获

形式如下:

image-20210729094125294

如果采用这种方式,虽然可以解决,但是存在弊端,需要我们在保存其他业务数据时,也需要在Controller方法中加上try...catch进行处理,代码冗余,不通用。

B. 使用异常处理器进行全局异常捕获

采用这种方式来实现,我们只需要在项目中定义一个通用的全局异常处理器,就可以解决本项目的所有异常。

2.6.2 全局异常处理器

在项目中自定义一个全局异常处理器,在异常处理器上加上注解 @ControllerAdvice,可以通过属性annotations指定拦截哪一类的Controller方法。 并在异常处理器的方法上加上注解 @ExceptionHandler 来指定拦截的是那一类型的异常。

异常处理方法逻辑:

  • 指定捕获的异常类型为 SQLIntegrityConstraintViolationException
  • 解析异常的提示信息, 获取出是那个值违背了唯一约束
  • 组装错误信息并返回
image-20210729100232642

所属包: com.itheima.reggie.common

import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController;
import java.sql.SQLIntegrityConstraintViolationException;

/**
 * 全局异常处理
 */
@ControllerAdvice(annotations = {RestController.class, Controller.class})
@ResponseBody
@Slf4j
public class  GlobalExceptionHandler {

    /**
     * 异常处理方法
     * @return
     */
    @ExceptionHandler(SQLIntegrityConstraintViolationException.class)
    public R<String> exceptionHandler(SQLIntegrityConstraintViolationException ex){
        log.error(ex.getMessage());
        if(ex.getMessage().contains("Duplicate entry")){
            String[] split = ex.getMessage().split(" ");
            String msg = split[2] + "已存在";
            return R.error(msg);
        }
        return R.error("未知错误");
    }
}

注解说明:

​ 上述的全局异常处理器上使用了的两个注解 @ControllerAdvice , @ResponseBody , 他们的作用分别为:

​ @ControllerAdvice : 指定拦截那些类型的控制器;

​ @ResponseBody: 将方法的返回值 R 对象转换为json格式的数据, 响应给页面;

​ 上述使用的两个注解, 也可以合并成为一个注解 @RestControllerAdvice

image-20210729100052940

标签:springframework,Controller,添加,处理器,import,全局,异常,cnblog
From: https://www.cnblogs.com/lingxin1123/p/17091893.html

相关文章

  • 过滤器实现登录拦截-cnblog
    1.3代码实现1).定义登录校验过滤器自定义一个过滤器LoginCheckFilter并实现Filter接口,在doFilter方法中完成校验的逻辑。那么接下来,我们就根据上述分析的步骤......
  • 文件上传解决方案-cnblog
    1.文件上传下载1.1上传介绍1.1.1概述文件上传,也称为upload,是指将本地图片、视频、音频等文件上传到服务器上,可以供其他用户浏览或下载的过程。文件上传在项目中应用......
  • 不使用docker部署项目需要启动的一些服务-cnblog
    mysqlredis./redis-servenginx:./nginx源springboot项目:nohupjava-jarhelloworld-1.0-SNAPSHOT.jar&>hello.log&springboot项目部署到服务器的注意......
  • SSM复习-cnblog
    依赖注入,注入配置文件中的属性名1.2加载properties文件上节中我们已经完成两个数据源druid和C3P0的配置,但是其中包含了一些问题,我们来分析下:这两个数据源中都使用到......
  • idea配置-cnblog
    另起一行快捷键shift+enter--------->ctrl+enter设置字号17,行距1.2,字体Consolas自动导包创建一个类自动生成注释信息......
  • 服务器部署项目-cnblog
    2.项目部署之前我们讲解Linux操作系统时,就提到,我们服务端开发工程师学习Linux系统的目的就是将来我们开发的项目绝大部分情况下都需要部署在Linux系统中。那么在本章节,我......
  • 订单处理-cnblog
    4.5代码开发在OrderController中创建submit方法,处理用户下单的逻辑:/***用户下单*@paramorders*@return*/@PostMapping("/submit")publicR<String>subm......
  • vue计算属性的完整写法-cnblog
    简单写法,给计算属性赋值报错解决方案:提供set方法实例(全选-->反选,反选->全选)<template><div><span>全选:</span><!--4.v-model关联全选-选中状态......
  • vue作用域插槽-cnblog
    使用场景:父组件需要使用到子组件的data时例子父组件有list数组,传递给子组件,子组件将数组中的属性全部显示出来,但是用什么标签显示这些属性不确定(使用插槽)父组件传......
  • vue侦听器深度侦听-cnblog
    简单类型不需要加上引号如对象user.name(注意加上引号)watch:{ "obj.name":{ ...}}侦听器的应用(存入本地存储localStorage)也可以在组件销毁时存入本......