当前位置: 首页 > 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);
    }

相关文章:

  • 【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中插入带超链接的参考文献/交叉引用/跳转参考文献
  • 《克莱默夫妇》导演罗伯特·本顿去世,终年92岁
  • 王毅谈中拉命运共同体建设“五大工程”及落实举措
  • 中国巴西关于乌克兰危机的联合声明
  • 回望乡土:对媒介化社会的反思
  • 季子文化与江南文化的根脉探寻与融合
  • 印巴战火LIVE丨“快速接近战争状态”:印度袭击巴军事基地,巴启动反制军事行动