为了账号安全,请及时绑定邮箱和手机立即绑定

ConstraintViolationException 和 MethodArgumentNot

ConstraintViolationException 和 MethodArgumentNot

翻过高山走不出你 2023-03-23 14:16:33
当我使用@Valid中的注解验证 bean 时javax.validation,对于我得到的一些对象ConstraintViolationException,对于一些我得到的是MethodArgumentNotValidException.我知道,如果我验证@ResponseBody控制器中的任何内容,它会抛出一个MethodArgumentNotValidException.@MyCustomValidation但是对于类级别的某些自定义验证(例如) ConstraintViolationException,即使它正在 @ResponseValidation 中进行验证,它也会抛出。对于不同 REST 端点的一些其他自定义验证,它会抛出MethodArgumentNotValidException.我发现理解它的行为有点困难。@PostMapping(path = "/someEndPoint")    @Validated(OnASave.class)public ResponseEntity<ClassA> saveObjA(@Valid @RequestBody ClassA objA)结果 - 抛出MethodArgumentNotValidException@PostMapping(path = "/someOtherEndPoint")   @Validated(OnBSave.class)public ResponseEntity<ClassB> saveObjB(@Valid @RequestBody ClassB objB)结果 - 抛出ConstraintViolationException和ClassA都有ClassB自定义验证。
查看完整描述

3 回答

?
慕妹3146593

TA贡献1820条经验 获得超9个赞

当您使用@Valid 时,您正在应用您在模型类字段上定义的验证,虽然有不同类型的验证,您可以选择@NotNull、@Max、@Min 等,您将获得匹配类型。

通常,所有这些都与在所有情况下都会抛出的MethodArgumentNotValidException并行。

来自官方文档

当验证用 @Valid 注释的参数失败时抛出异常。

当违反某些约束时,休眠实体管理器会抛出 ConstraintViolationException,因此这意味着您违反了正在使用的某些实体中的某些字段。


查看完整回答
反对 回复 2023-03-23
?
aluckdog

TA贡献1847条经验 获得超7个赞

为了简单理解,如果通过使用@Valid 注释在控制器/服务层进行验证,它会生成 MethodArgumentNotValidException,您可以为此添加处理程序并相应地返回响应,此类是 spring 框架的一部分,验证由 spring 框架执行见下面的示例


@ExceptionHandler(MethodArgumentNotValidException.class)

public ResponseEntity<Response> handleMethodArgumentNotValidException(MethodArgumentNotValidException ex) {


    logger.info("Invalid arguments found : " + ex.getMessage());

    // Get the error messages for invalid fields

    List<FieldError> errors = ex.getBindingResult()

            .getFieldErrors()

            .stream()

            .map(fieldError -> new FieldError(fieldError.getField(), fieldError.getDefaultMessage()))

            .collect(Collectors.toList());


    String message = messageSource.getMessage("invalid.data.message", null, LocaleContextHolder.getLocale());

    Response response = new Response(false, message)

            .setErrors(errors);

    ResponseEntity<Response> responseEntity = ResponseEntity.status(HttpStatus.BAD_REQUEST).body(response);

    return responseEntity;

}

并且如果您不使用@Valid 注释进行验证,并且在 jpa 层由 hibernate 引发异常,它会生成 ConstraintViolationException,此异常是 Javax bean 验证框架的一部分,并在执行持久性操作时引发(在实际执行 sql 之前)请参阅下面的示例


@ExceptionHandler(ConstraintViolationException.class)

    public ResponseEntity<Response> handleConstraintViolationException(ConstraintViolationException ex) {

        List<FieldError> errors = ex.getConstraintViolations()

                .stream()

                .map(constraintViolation -> {

                    return new FieldError(constraintViolation.getRootBeanClass().getName() + " " + constraintViolation.getPropertyPath(), constraintViolation.getMessage());

                })

                .collect(Collectors.toList());


        String message = messageSource.getMessage("invalid.data.message", null, LocaleContextHolder.getLocale());

        Response response = new Response(false, message)

                .setErrors(errors);

        ResponseEntity<Response> responseEntity = ResponseEntity.status(HttpStatus.BAD_REQUEST).body(response);

        return responseEntity;

    }


查看完整回答
反对 回复 2023-03-23
?
翻阅古今

TA贡献1780条经验 获得超5个赞

看看这篇文章。当您将 spring 的验证框架与 bean 验证混合使用时,会在不同情况下抛出这些异常。



查看完整回答
反对 回复 2023-03-23
  • 3 回答
  • 0 关注
  • 643 浏览

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号