spring validation驗證框架對參數的驗證機制提供了@Validated(Spring's JSR-303規范,是標准JSR-303的一個變種),javax提供了@Valid(標准JSR-303規范),配合BindingResult可以直接提供參數驗證結果,校驗數據,如果數據異常則會統一拋出異常,方便異常中心統一處理
包:package org.springframework.validation.annotation;
在檢驗Controller的入參是否符合規范時,使用@Validated或者@Valid在基本驗證功能上沒有太多區別,但是在分組、注解地方、嵌套驗證等功能上兩個有所不同:
-
分組
@Validated:提供了一個分組功能,可以在入參驗證時,根據不同的分組采用不同的驗證機制
@Valid:作為標准JSR-303規范,還沒有分組的功能
-
注解地方
@Validated:可以在類、方法和方法參數上。但是不能用在成員屬性(字段)上
@Valid:可以用在方法、構造函數、方法參數和成員屬性(字段)上
-
嵌套驗證
嵌套驗證就是一個實體類用的某個字段屬性是一個集合,集合存儲其他的實體類,需要驗證集合和集合中實體類中的字段屬性是否校驗合格,稱為嵌套驗證(或該某個字段屬性是其他的實體類,需校驗給實體類中的字段是否校驗合格)
@Validated和@Valid加在方法參數前,都不會自動對參數進行嵌套驗證,需要@Validated和@Valid配合使用,@Validated作用方法的入參,@Valid作用實體類字段
@Validated和@Valid在嵌套驗證功能上的區別:
-
@Validated:用在方法入參上無法單獨提供嵌套驗證功能。不能用在成員屬性(字段)上,也無法提示框架進行嵌套驗證。能配合嵌套驗證注解@Valid進行嵌套驗證。
-
@Valid:用在方法入參上無法單獨提供嵌套驗證功能。能夠用在成員屬性(字段)上,提示驗證框架進行嵌套驗證。能配合嵌套驗證注解@Valid進行嵌套驗證。
統一異常處理-->攔截器
@Slf4j
@ControllerAdvice
public class ValidatedExceptionHandler {
/**
* 處理@Validated參數校驗失敗異常
* @param exception 異常類
* @return 響應
*/
@ResponseBody
@ResponseStatus(HttpStatus.BAD_REQUEST)
@ExceptionHandler(MethodArgumentNotValidException.class)
public Result exceptionHandler(MethodArgumentNotValidException exception){
BindingResult result = exception.getBindingResult();
StringBuilder stringBuilder = new StringBuilder();
if (result.hasErrors()) {
List<ObjectError> errors = result.getAllErrors();
if (errors != null) {
errors.forEach(p -> {
FieldError fieldError = (FieldError) p;
log.warn("Bad Request Parameters: dto entity [{}],field [{}],message [{}]",fieldError.getObjectName(), fieldError.getField(), fieldError.getDefaultMessage());
stringBuilder.append(fieldError.getDefaultMessage());
});
}
}
return ResultUtil.validatedException(stringBuilder.toString());
}
}
參考地址:https://blog.csdn.net/qq_27680317/article/details/79970590