当前位置: 首页 > news >正文

MethodArgumentNotValidException 与 ConstraintViolationException

MethodArgumentNotValidException 和ConstraintViolationException 都是用于处理参数校验异常的异常类,但它们在不同的上下文中使用。

1. MethodArgumentNotValidException:
   - MethodArgumentNotValidException 是在 Spring MVC 或 Spring Boot 中处理参数校验异常时抛出的异常。继承至BindException 属于检测异常
   - 当使用注解(如 @Valid)进行参数校验时,如果参数违反了约束条件,就会抛出 MethodArgumentNotValidException 异常。
   - 通常,该异常是在控制器(Controller)中接收到请求参数后发生的,它包含了关于哪个参数违反了约束条件以及相应的错误消息。
   - 可通过编写全局异常处理器 @ExceptionHandler(MethodArgumentNotValidException.class) 来捕获和处理此异常。

2. ConstraintViolationException:
   - ConstraintViolationException 是在 Java Bean Validation(JSR 380)规范中定义的一个异常类。属于非检查异常
   - 当使用注解进行参数校验时,如果参数违反了约束条件(例如,@NotNull、@Size、@Pattern等),就会抛出 ConstraintViolationException 异常。
   - 该异常不局限于 Spring MVC 或 Spring Boot,可以用于任何遵循 Java Bean Validation 规范的环境。
   - 可通过编写对应的异常处理器来捕获和处理此异常。

注意:

1.对于参数校验异常 中MethodArgumentNotValidException 无法捕获的异常可以用 ConstraintViolationException捕获处理

2.对于集合参数List<Object>中具体对象的属性校验一般情况下MethodArgumentNotValidException捕获不了,可以用ConstraintViolationException找到是集合参数中中具体哪一个对象参数校验失败  处理代码举例

@ResponseBody
    @ExceptionHandler(value = ConstraintViolationException.class)
    public Result<xx> doHandException(ConstraintViolationException e) {
        log.error("服务异常:", e);
        ConstraintViolationException validException = (ConstraintViolationException) e;
        Set<ConstraintViolation<?>> violations = validException.getConstraintViolations();
        // 将验证失败的信息转换为自定义的错误信息
        List<String> errorMessages = new ArrayList<>();
        for (ConstraintViolation<?> violation : violations) {
            String errorMessage = violation.getPropertyPath() + ": " + violation.getMessage();
            errorMessages.add(errorMessage);
            String str = JSON.toJSONString(violation.getExecutableParameters()[0]);
            errorMessages.add(str);
        }
        log.error(JSON.toJSONString(errorMessages));
        // 构建错误响应
        return new ResponseEntity<>(Result<xx>.xxx(errorMessages.get(0)), HttpStatus.BAD_REQUEST);
    }

http://www.dtcms.com/a/4483.html

相关文章:

  • 【Element】el-progress 自定义进度条
  • 【C++】类与对象(中)
  • Javaweb实现数据库简单的增删改查
  • IOS输入框聚焦会把内容区域顶起
  • 数据库管理变更工具
  • frp内网穿透配置以及相关端口、过程解释
  • API之 要求接口上传pdf 以 合同PDF的二进制数据,multpart方式上传
  • Pickcode:教孩子们编码的新视觉语言
  • 【机器学习】Nonlinear Independent Component Analysis - Aapo Hyvärinen
  • c# 基础语法
  • 注解案例:山寨Junit与山寨JPA
  • 合肥中科深谷嵌入式项目实战——基于ARM语音识别的智能家居系统(三)
  • 【11月比赛合集】48场可报名的数据挖掘大奖赛,任君挑选!
  • 第二十章 多线程
  • java面试-zookeeper
  • 【Linux】-进程间通信-共享内存(SystemV),详解接口函数以及原理(使用管道处理同步互斥机制)
  • 功能测试进阶建议,学习思路讲解
  • 每日一题:LeetCode-589.N叉树的前序遍历
  • Web前端—移动Web第三天(移动Web基础、rem、less、综合案例—极速问诊)
  • Zotero在word中插入带超链接的参考文献/交叉引用/跳转参考文献
  • 9 HDFS架构剖析
  • 论文阅读——DiffusionDet
  • 基于鹈鹕算法优化概率神经网络PNN的分类预测 - 附代码
  • Flink Operator 使用指南 之 全局配置
  • Unity开发之C#基础-File文件读取
  • WPF基础DataGrid控件
  • Docker Golang 开发环境搭建指南
  • 电动汽车充放电V2G模型MATLAB代码
  • 【论文阅读笔记】Deep learning for time series classification: a review
  • HTML+CSS+ElementUI搭建个人博客静态页面展示(纯前端)