Spring 使用Validation 驗證框架的問題詳解
一、介紹
Spring Validation 驗證框架對參數的驗證機制提供瞭@Validated (Spring’s JSR-303 規范,是標準 JSR-303 的一個變種),javax 提供瞭@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.getValidator(); } @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) { BindingResult 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 驗證框架內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!
推薦閱讀:
- @valid 無法觸發BindingResult的解決
- Spring 中@Validated 分組校驗的使用解析
- 詳解Spring中@Valid和@Validated註解用法
- 如何使用Bean Validation 解決業務中參數校驗
- 如何解決@NotBlank不生效的問題