SpringBoot系列17-统一异常处理(包含简单的JSR303参数校验)

2023-05-16

SpringBoot系列17-统一异常处理(包含简单的JSR303参数校验)

    • 原文链接:[https://www.lskyf.com/post/211](https://www.lskyf.com/post/211)
    • 方法1.通过ControllerAdvice实现+简单的JSR303参数校验实现
      • 1.1 加入依赖
      • 1.2 校验Bean.java实现
    • 统一异常处理的ExceptionControllerAdvice.java
      • 测试TestContorller.java
    • 方法2.通过继承BaseController实现
    • 更多关于JSR303参数校验请参照:[SpringBoot系列18-validation分组校验+自定义参数校验器: https://www.lskyf.com/post/212](https://www.lskyf.com/post/212)

原文链接:https://www.lskyf.com/post/211

方法1.通过ControllerAdvice实现+简单的JSR303参数校验实现

1.1 加入依赖

<dependencies>
     <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-validation</artifactId>
      </dependency>
</dependencies>

1.2 校验Bean.java实现

/**
 * @author yuanfenge
 * @description
 * @createTime 2019 - 3 - 07 11:54
 */
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class Bean {

    @NotNull(message = "不能为空")
    private String name;

    @Min(value = 1, message = "大于0")
    @NotNull(message = "不能为空")
    private Integer age;
}

统一异常处理的ExceptionControllerAdvice.java

/**
 * @author yuanfenge
 * 方法1:异常处理
 */
@Slf4j
@ControllerAdvice
public class ExceptionControllerAdvice {

    /**
     * 已废弃:发现此方法已失效
     * 使用{@link ExceptionControllerAdvice#bindExceptionHandler(MethodArgumentNotValidException)}替代
     * 处理BindException异常
     * 获得参数和错误消息封装到map集合通过json返回
     * @param ex
     * @return
     * @throws Exception
     */
    @Deprecated
    @ExceptionHandler(BindException.class)
    @ResponseBody
    public Map<String, Object> bindExceptionHandler(BindException ex) throws Exception {
        String s = ex.getFieldError().getField() + ":" + ex.getFieldError().getDefaultMessage();
        Map<String, Object> map = new HashMap<>();
        map.put("code", 400);
        map.put("msg", s);
        return map;
    }

    /**
     * 最新参数绑定异常
     * @param ex
     * @return
     * @throws Exception
     */
    @ExceptionHandler(value = MethodArgumentNotValidException.class)
    @ResponseBody
    public Map<String, Object> bindExceptionHandler(MethodArgumentNotValidException ex) throws Exception {
        BindingResult result = ex.getBindingResult();
        StringBuilder s=new StringBuilder();
        if (result.hasErrors()) {

            List<ObjectError> errors = result.getAllErrors();
            errors.forEach(p ->{
                FieldError fieldError = (FieldError) p;
                s.append(fieldError.getField()+":"+fieldError.getDefaultMessage());
            });
        }
        Map<String,Object> map=new HashMap<>();
        map.put("code",400);
        map.put("msg",s);
        return map;
    }
    /**
     * 处理自定义的ParamException异常
     * 获得参数和错误消息封装到map集合通过json返回
     * @param ex
     * @return
     * @throws Exception
     */
    @ExceptionHandler(ParamException.class)
    @ResponseBody
    public Map<String, Object> customExceptionHandler(ParamException ex) throws Exception {
        String msg = ex.getMessage();
        Map<String, Object> map = new HashMap<>();
        map.put("code", 400);
        map.put("msg", msg);
        return map;
    }

    /**
     * 处理其他异常
     * @param ex
     * @return
     * @throws Exception
     */
    @ExceptionHandler(Exception.class)
    @ResponseBody
    public Map<String, Object> exceptionHandler(Exception ex) throws Exception {
        String msg = ex.getMessage();
        Map<String, Object> map = new HashMap<>();
        map.put("code", 500);
        map.put("msg", msg);
        return map;
    }
}

测试TestContorller.java


@RestController
public class TestContorller {

    @RequestMapping("/valid")
    public Object valid(@Valid Bean bean) throws ParamException, CustomException {
        customParamCheck(bean);
        //customException();//打开注释可以测试自定义异常处理代码
        runtimeException();
        return bean;
    }

    private void runtimeException() {
        int a = 1 / 0;
    }

    private void customParamCheck(@Valid Bean bean) throws ParamException {
        if (bean.getAge() > 100) {
            throw new ParamException("age不能超过100");
        }
    }

    private void customException() throws CustomException {
        throw new CustomException("customException!!!");
    }
}

方法2.通过继承BaseController实现


/**
* 方法2:异常处理 其他controller继承BaseController即可
*/
public class BaseController {
   /**
    * 已废弃:发现此方法已失效
    * 使用{@link BaseController#bindExceptionHandler(MethodArgumentNotValidException)}替代
    * 处理BindException异常
    * 获得参数和错误消息封装到map集合通过json返回
    * @param ex
    * @return
    * @throws Exception
    */
   @Deprecated
   @ExceptionHandler(BindException.class)
   @ResponseBody
   public Map<String, Object> bindExceptionHandler(BindException ex) throws Exception {
       String s = ex.getFieldError().getField() + ":" + ex.getFieldError().getDefaultMessage();
       Map<String, Object> map = new HashMap<>();
       map.put("code", 400);
       map.put("msg", s);
       return map;
   }

   /**
    * 最新参数绑定异常
    * @param ex
    * @return
    * @throws Exception
    */
   @ExceptionHandler(value = MethodArgumentNotValidException.class)
   @ResponseBody
   public Map<String, Object> bindExceptionHandler(MethodArgumentNotValidException ex) throws Exception {
       BindingResult result = ex.getBindingResult();
       StringBuilder s=new StringBuilder();
       if (result.hasErrors()) {

           List<ObjectError> errors = result.getAllErrors();
           errors.forEach(p ->{
               FieldError fieldError = (FieldError) p;
               s.append(fieldError.getField()+":"+fieldError.getDefaultMessage());
           });
       }
       Map<String,Object> map=new HashMap<>();
       map.put("code",400);
       map.put("msg",s);
       return map;
   }

   @ExceptionHandler(ParamException.class)
   @ResponseBody
   public Map<String, Object> customExceptionHandler(ParamException ex) throws Exception {
       String msg = ex.getMessage();
       Map<String, Object> map = new HashMap<>();
       map.put("code", 400);
       map.put("msg", msg);
       return map;
   }

   @ExceptionHandler(Exception.class)
   @ResponseBody
   public Map<String, Object> customExceptionHandler(Exception ex) throws Exception {
       String msg = ex.getMessage();
       Map<String, Object> map = new HashMap<>();
       map.put("code", 500);
       map.put("msg", msg);
       return map;
   }
}

更多关于JSR303参数校验请参照:SpringBoot系列18-validation分组校验+自定义参数校验器: https://www.lskyf.com/post/212

源码下载链接

原文链接: https://www.lskyf.com/post/211

作者:猿份哥,版权所有,欢迎保留原文链接进行转载:)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

SpringBoot系列17-统一异常处理(包含简单的JSR303参数校验) 的相关文章

  • 【Qt线程-1】this,volatile,exec(),moveToThread()

    背景 xff1a 个人学习多线程控制 xff0c 写了一些博文用于记录 xff1a Qt线程 2 事件循环 xff08 QCoreApplication processEvents xff0c exec xff09 的应用 Qt线程 3 使
  • 【Qt线程-2】事件循环(QCoreApplication::processEvents,exec)的应用

    背景 xff1a 个人学习多线程控制 xff0c 写了一些博文用于记录 Qt线程 1 this xff0c volatile xff0c exec xff0c moveToThread Qt线程 3 使用事件循环 xff0c 信号 xff0
  • 【Qt线程-4】事件循环嵌套,BlockingQueuedConnection与QWaitCondition比较

    背景 xff1a 个人学习多线程控制 xff0c 写了一些博文用于记录 xff1a Qt线程 1 this xff0c volatile xff0c exec xff0c moveToThread Qt线程 2 事件循环 xff08 QCo
  • 【Qt样式(qss)-3】几套配色方案

    背景 xff1a 之前写过有关qss的博客 xff0c 记录了如何使用qt手册 xff0c 以及在项目中如何使用qss的体验 经过实践 xff0c 我归纳了自己需要的qss使用方法 xff0c 使之尽量高效 xff0c 容易维护 Qt样式
  • 【Qt样式(qss)-4】应用到QMdiArea不生效的解决

    背景 xff1a 之前写记录过几篇qss相关内容 xff1a Qt样式 xff08 qss xff09 1 手册小结 xff08 附例 xff1a 软件深色模式 xff09 Qt样式 xff08 qss xff09 2 使用小结 xff08
  • Google play billing(Google play 内支付) 下篇

    开篇 xff1a 如billing开发文档所说 xff0c 要在你的应用中实现In app Billing只需要完成以下几步就可以了 第一 把你上篇下载的AIDL文件添加到你的工程里 xff0c 第二 把 lt uses permissio
  • Qt creator中操作QAction加入QToolBar

    背景 xff1a 个人笔记 我之前没有系统化学习过任何资料 xff0c 使用很多工具都是按需出发 xff0c 直接上手 xff0c 遇到问题再研究的 所以会有一些弯路 本文言语中难免有对个人情绪的生动描述 xff0c 希望不要影响读者心情
  • Java 通过map构造树形结构

    在开发中 xff0c 经常会有将 数据组装成为树形结构的场景 xff0c 除了可以通过递归实现 xff0c 还可以通过map 组装实现 一 xff0c 构造基本数据 import apple laf JRSUIUtils import co
  • 【无标题】es搜索基本操作

    一 xff0c 准备数据 1 创建索引 PUT lagou book 2 创建mapping PUT lagou book doc mapping 34 properties 34 34 description 34 34 type 34
  • 【ES】常用操作工具

    工欲善其事 xff0c 必先利于器 xff0c es使用过程中 xff0c 有些工具能帮助我们快速的上手和使用 一 es head es head 是一款专门针对 es的客户端工具elasticSearch配置包 是一个基于node js的
  • 【es】基本概念理解

    一 xff0c 初识es 1 是什么 xff1f ElasticSearch 简称es 开源的分布式的全文搜索引擎 xff0c 可以近乎实时的存储检索数据 xff0c es使用java开发 xff0c 并且使用Lucene作为核心实现搜索功
  • 无法安装net framework 3.5 的解决方法

    电脑刚重装了Windows8 1系统 xff0c 然后安装数据库的时候 xff0c 却出现了这样的问题 xff1a 您的电脑上的应用需要使用以下windows功能 问题原因是 xff1a 在安装系统的时候 xff0c NET Framewo
  • 【计算机网络原理】第四章 数据链路层

    今天主要梳理了一下数据链路层的内容 xff0c 如下 一 宏观规划 综合数据链路层的整体 xff0c 分为两大部分 xff0c 第一部分讲解数据链路层的功能 xff0c 第二部分讲解数据链路层的功能 这些协议 xff0c 其实还是为了实现数
  • 【redis】关系型数据库 VS 非关系型数据库

    一 关系型数据库 xff1f 1 概念 关系型数据库是指采用了关系模型来组织数据的数据库 简单来说 xff0c 关系模式就是二维表格模型 主要代表 xff1a SQL Server xff0c Oracle Mysql PostgreSQL
  • resultful风格接口

    一 产生背景 网络应用程序 xff0c 越来越流行前端和后端的分离设计 当前的发展趋势是前端的设计层出不穷 比如 xff1a 各种型号的手机 平板灯其他设计 因为必须要一种统一的机制方便不同的前端和后端进行通信 这就导致了API结构的流行
  • 【kafka】Exception thrown when sending a message with key='null' and payload='lizhenjuan;99' to topic

    今天碰到一个奇怪的问题 xff0c 如下图 xff1a 一 问题 1 问题截图 上午还可以发送消息成功的 xff0c 下午突然就发送不了消息了 我就检查我代码的问题 xff0c 是传递的格式不对 xff0c 还是数据要求不对 网上的资料显示
  • 【0723】自动化运维——saltstack

    24 1 自动化运维介绍 认识自动化运维 xff1a 传统运维效率低 xff0c 大多工作人为完成传统运维工作繁琐 xff0c 容易出错传统运维每日重复做相同的事情传统运维没有标准化流程传统运维的脚本繁多 xff0c 不能方便管理自动化运维
  • 【mysql】order by多个字段排序

    今天遇到了两个字段排序的问题 xff0c 感觉不是很清晰 xff0c 所有又按照规则查询了下 xff0c 总结下 count都是306的有三个 现在需要同时按照age和count排序 xff0c 测试最后的排序结果 默认都是按照age和co
  • java8使用积累

    1 将List lt T gt 数组转换为String并用逗号隔开 String join 34 34 List 2 idea自动补全代码教程 xff1a https www cnblogs com HF Made p 11417225 h
  • 【java】手动分页工具类

    最近小编遇到一个很绕的问题 xff0c 无法使用mybatis自带的分页插件对符合条件的数据进行分页 xff0c 故收集了一个自动分页的工具类 xff1a public static lt T gt List lt T gt getPage

随机推荐