猿问

ConstraintViolationException 和 MethodArgumentNot

当我使用@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自定义验证。


翻过高山走不出你
浏览 644回答 3
3回答

慕妹3146593

当您使用@Valid 时,您正在应用您在模型类字段上定义的验证,虽然有不同类型的验证,您可以选择@NotNull、@Max、@Min 等,您将获得匹配类型。通常,所有这些都与在所有情况下都会抛出的MethodArgumentNotValidException并行。来自官方文档当验证用 @Valid 注释的参数失败时抛出异常。当违反某些约束时,休眠实体管理器会抛出 ConstraintViolationException,因此这意味着您违反了正在使用的某些实体中的某些字段。

aluckdog

为了简单理解,如果通过使用@Valid 注释在控制器/服务层进行验证,它会生成 MethodArgumentNotValidException,您可以为此添加处理程序并相应地返回响应,此类是 spring 框架的一部分,验证由 spring 框架执行见下面的示例@ExceptionHandler(MethodArgumentNotValidException.class)public ResponseEntity<Response> handleMethodArgumentNotValidException(MethodArgumentNotValidException ex) {&nbsp; &nbsp; logger.info("Invalid arguments found : " + ex.getMessage());&nbsp; &nbsp; // Get the error messages for invalid fields&nbsp; &nbsp; List<FieldError> errors = ex.getBindingResult()&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; .getFieldErrors()&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; .stream()&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; .map(fieldError -> new FieldError(fieldError.getField(), fieldError.getDefaultMessage()))&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; .collect(Collectors.toList());&nbsp; &nbsp; String message = messageSource.getMessage("invalid.data.message", null, LocaleContextHolder.getLocale());&nbsp; &nbsp; Response response = new Response(false, message)&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; .setErrors(errors);&nbsp; &nbsp; ResponseEntity<Response> responseEntity = ResponseEntity.status(HttpStatus.BAD_REQUEST).body(response);&nbsp; &nbsp; return responseEntity;}并且如果您不使用@Valid 注释进行验证,并且在 jpa 层由 hibernate 引发异常,它会生成 ConstraintViolationException,此异常是 Javax bean 验证框架的一部分,并在执行持久性操作时引发(在实际执行 sql 之前)请参阅下面的示例@ExceptionHandler(ConstraintViolationException.class)&nbsp; &nbsp; public ResponseEntity<Response> handleConstraintViolationException(ConstraintViolationException ex) {&nbsp; &nbsp; &nbsp; &nbsp; List<FieldError> errors = ex.getConstraintViolations()&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; .stream()&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; .map(constraintViolation -> {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; return new FieldError(constraintViolation.getRootBeanClass().getName() + " " + constraintViolation.getPropertyPath(), constraintViolation.getMessage());&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; })&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; .collect(Collectors.toList());&nbsp; &nbsp; &nbsp; &nbsp; String message = messageSource.getMessage("invalid.data.message", null, LocaleContextHolder.getLocale());&nbsp; &nbsp; &nbsp; &nbsp; Response response = new Response(false, message)&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; .setErrors(errors);&nbsp; &nbsp; &nbsp; &nbsp; ResponseEntity<Response> responseEntity = ResponseEntity.status(HttpStatus.BAD_REQUEST).body(response);&nbsp; &nbsp; &nbsp; &nbsp; return responseEntity;&nbsp; &nbsp; }

翻阅古今

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

相关分类

Java
我要回答