1. 程式人生 > 程式設計 >Spring 使用Validation 驗證框架的問題詳解

Spring 使用Validation 驗證框架的問題詳解

一、介紹

Spring Validation 驗證框架對引數的驗證機制提供了@Validated (Spring's R-303 規範,是標準 JSR-303 的一個變種),x 提供了@Valid(標準 JSR-303 規範),配合 BindingResult 可以直接提供引數驗證結果。其中對於欄位的特定驗證註解,比如 @NotNull。
兩者在檢驗 Controller 的入參是否符合規範時,使用@Validated 或者 @Valid 在基本驗證功能上沒有太多區別。但是在分組、註解地方、巢狀驗證等功能上兩個有所不同:

1.@Validated
分組:提供分組功能,可在入參驗證時,根據不同的分組採用不同的驗證機制。

可註解位置:可以用在型別、方法和方法引數上。但是不能用在成員屬性上
巢狀驗證:用在方法入參上無法單獨提供巢狀驗證功能;不能用在成員屬性上;也無法提供框架進行巢狀驗證;能配合巢狀驗證註解 @Valid 進行巢狀驗證。

2.@Valid
分組:無分組功能
可註解位置:可以用在方法、建構函式、方法引數和成員屬性上(兩者是否能用於成員屬性上直接影響能否提供巢狀驗證的功能)
巢狀驗證:用在方法入參上無法單獨提供巢狀驗證功能;能夠用在成員屬性上,提示驗證框架進行巢狀驗證;能配合巢狀驗證註解@Valid進行巢狀驗證。

二、使用

1. SpringBoot 2.3.0後需要新增依賴

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-validation</artifactId>
</dependency>

2. 配置 validation 使出現校驗失敗即返回

@Configuration
public class WebConfig {
    @Bean
    public Validator validator() {
        ValidatorFactory validatorFactory = Validation.byProvider(HibernateValidator.class)
                .configure()
                //failFast的意思只要出現校驗失敗的情況,就立即結束校驗,不再進行後續的校驗。
                .failFast(true)
                .buildValidatorFactory();
 
        return validatorFactory.getValidatowww.cppcns.com
r(); www.cppcns.com} @Bean public MethodValidationPostProcessor methodValidationPostProcessor() { MethodValidationPostProcessor methodValidationPostProcessor = new MethodValidationPostProcessor(); methodValidationPostProcessor.setValidator(validator()); return methodValidationPostProcessor; } }

4. 編寫全局異常捕獲,捕獲驗證失敗,統一返回

@Slf4j
@ControllerAdvice
public class ValidatedExceptionHandler {

    @ResponseBody
    @ExceptionHandler(BindException.class)
    public String exceptionHandler2(BindException exception) {
        BindingResult result = exception.getBindingResult();
        if (result.hasErrors()) {
            return result.getAllErrors().get(0).getDefaultMessage();
        }
        return "引數不可為空!";
    }

    @ResponseBody
    @ExceptionHandler(MethodArgumentNotValidException.class)
    public String exceptionHandler2(MethodArgumentNotValidException exception) {
        Bind客棧ingResult result = exception.getBindingResult();
        if (result.hasErrors()) {
            return result.getAllErrors().get(0).getDefaultMessage();
        }
        return "引數不可為空!";
    }
}

5. 定義Dto,在引數上添加註解校驗

@Data
public class ValidDto {
    @NotEmpty(message = "name 不可為空!")
    private String name;

    @NotBlank(message = "userId 不可為空!")
    private String userId;

    @Min(value = 1,message = "年齡有誤!")
    @Max(value = 120,message = "年齡有誤!")
    private int age;

    @NotBlank(message = "郵箱不可為空!")
    @Email(message = "郵箱有誤!")
    private String email;

    @NotBlank(message = "mobile不可為空!")
    @Pattern(regexp = "^(13[0-9]|14[579]|15[0-3,5-9]|16[6]|17[0135678]|18[0-9]|19[89])\\d{8}$",message = "手機號碼有誤!")
    private String mobile;

    @NotNull(message = "validVo 不可為空!")
    @Valid
    private ValidVo validVo;

    @NotEmpty(message = "list1 不可為空!")
    @Size(min = 1,max = 2,message = "list1 資料過大")
    @Valid
    private List<ValidVo> list1;
}
@Data
public class ValidVo {
    @NotBlank(message = "gender is null")
    private String gender;
    @NotBlank(message = "test is null")
    private String test;
}

6. Controller

@RestController
@RequestMapping("/valid")
@CrossOrigin
public class ValidController {

    @GetMapping("/GetTest")
    public String getTest(@Valid ValidDto dto,BindingResult result) {
        if (result.hasErrors()) {
            return result.getAllErrors().get(0).getDefaultMessage();
        }
        return "success";
    }

    @GetMapping("/GetTest2")
    public String getTest2(@Validated ValidDto dto) {

        return "success";
    }

    @GetMapping("/GetTest3")
    public String getTest3(@Validated @RequestBody ValidDto dto) {

        return "success";
    }
}

到此這篇關於Spring 使用Validation 驗證框架的問題詳解的文章就介紹到這了,更多相關Spring Validation 驗證框架內容請搜尋我們以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援我們!