3 回答

TA貢獻(xiàn)1820條經(jīng)驗(yàn) 獲得超9個(gè)贊
當(dāng)您使用@Valid 時(shí),您正在應(yīng)用您在模型類字段上定義的驗(yàn)證,雖然有不同類型的驗(yàn)證,您可以選擇@NotNull、@Max、@Min 等,您將獲得匹配類型。
通常,所有這些都與在所有情況下都會(huì)拋出的MethodArgumentNotValidException并行。
來自官方文檔
當(dāng)驗(yàn)證用 @Valid 注釋的參數(shù)失敗時(shí)拋出異常。
當(dāng)違反某些約束時(shí),休眠實(shí)體管理器會(huì)拋出 ConstraintViolationException,因此這意味著您違反了正在使用的某些實(shí)體中的某些字段。

TA貢獻(xiàn)1847條經(jīng)驗(yàn) 獲得超7個(gè)贊
為了簡單理解,如果通過使用@Valid 注釋在控制器/服務(wù)層進(jìn)行驗(yàn)證,它會(huì)生成 MethodArgumentNotValidException,您可以為此添加處理程序并相應(yīng)地返回響應(yīng),此類是 spring 框架的一部分,驗(yàn)證由 spring 框架執(zhí)行見下面的示例
@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 注釋進(jìn)行驗(yàn)證,并且在 jpa 層由 hibernate 引發(fā)異常,它會(huì)生成 ConstraintViolationException,此異常是 Javax bean 驗(yàn)證框架的一部分,并在執(zhí)行持久性操作時(shí)引發(fā)(在實(shí)際執(zhí)行 sql 之前)請(qǐng)參閱下面的示例
@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;
}
添加回答
舉報(bào)