1. 程式人生 > 其它 >@Validated、@Valid等引數或屬性欄位校驗

@Validated、@Valid等引數或屬性欄位校驗

spring validation驗證框架對引數的驗證機制提供了@Validated(Spring's JSR-303規範,是標準JSR-303的一個變種),javax提供了@Valid(標準JSR-303規範),配合BindingResult可以直接提供引數驗證結果,校驗資料,如果資料異常則會統一丟擲異常,方便異常中心統一處理
包:package org.springframework.validation.annotation;
在檢驗Controller的入參是否符合規範時,使用@Validated或者@Valid在基本驗證功能上沒有太多區別,但是在分組、註解地方、巢狀驗證等功能上兩個有所不同:

  1. 分組

    @Validated:提供了一個分組功能,可以在入參驗證時,根據不同的分組採用不同的驗證機制

    @Valid:作為標準JSR-303規範,還沒有分組的功能

  2. 註解地方

    @Validated:可以在類、方法和方法引數上。但是不能用在成員屬性(欄位)上

    @Valid:可以用在方法、建構函式、方法引數和成員屬性(欄位)上

  3. 巢狀驗證

    巢狀驗證就是一個實體類用的某個欄位屬性是一個集合,集合儲存其他的實體類,需要驗證集合和集合中實體類中的欄位屬性是否校驗合格,稱為巢狀驗證(或該某個欄位屬性是其他的實體類,需校驗給實體類中的欄位是否校驗合格)

@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