您好,登錄后才能下訂單哦!
這篇文章主要介紹了Spring如何使用Validation驗證框架,具有一定借鑒價值,感興趣的朋友可以參考下,希望大家閱讀完這篇文章之后大有收獲,下面讓小編帶著大家一起了解一下。
Spring Validation 驗證框架對參數(shù)的驗證機制提供了@Validated (Spring's JSR-303 規(guī)范,是標準 JSR-303 的一個變種),javax 提供了@Valid(標準 JSR-303 規(guī)范),配合 BindingResult 可以直接提供參數(shù)驗證結果。其中對于字段的特定驗證注解,比如 @NotNull。
兩者在檢驗 Controller 的入?yún)⑹欠穹弦?guī)范時,使用@Validated 或者 @Valid 在基本驗證功能上沒有太多區(qū)別。但是在分組、注解地方、嵌套驗證等功能上兩個有所不同:
1.@Validated
分組:提供分組功能,可在入?yún)Ⅱ炞C時,根據(jù)不同的分組采用不同的驗證機制。
可注解位置:可以用在類型、方法和方法參數(shù)上。但是不能用在成員屬性上
嵌套驗證:用在方法入?yún)⑸蠠o法單獨提供嵌套驗證功能;不能用在成員屬性上;也無法提供框架進行嵌套驗證;能配合嵌套驗證注解 @Valid 進行嵌套驗證。
2.@Valid
分組:無分組功能
可注解位置:可以用在方法、構造函數(shù)、方法參數(shù)和成員屬性上(兩者是否能用于成員屬性上直接影響能否提供嵌套驗證的功能)
嵌套驗證:用在方法入?yún)⑸蠠o法單獨提供嵌套驗證功能;能夠用在成員屬性上,提示驗證框架進行嵌套驗證;能配合嵌套驗證注解@Valid進行嵌套驗證。
1. SpringBoot 2.3.0后需要添加依賴
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-validation</artifactId> </dependency>
2. 配置 validation 使出現(xiàn)校驗失敗即返回
@Configuration public class WebConfig { @Bean public Validator validator() { ValidatorFactory validatorFactory = Validation.byProvider(HibernateValidator.class) .configure() //failFast的意思只要出現(xiàn)校驗失敗的情況,就立即結束校驗,不再進行后續(xù)的校驗。 .failFast(true) .buildValidatorFactory(); return validatorFactory.getValidator(); } @Bean public MethodValidationPostProcessor methodValidationPostProcessor() { MethodValidationPostProcessor methodValidationPostProcessor = new MethodValidationPostProcessor(); methodValidationPostProcessor.setValidator(validator()); return methodValidationPostProcessor; } }
4. 編寫全局異常捕獲,捕獲驗證失敗,統(tǒng)一返回
@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 "參數(shù)不可為空!"; } @ResponseBody @ExceptionHandler(MethodArgumentNotValidException.class) public String exceptionHandler2(MethodArgumentNotValidException exception) { BindingResult result = exception.getBindingResult(); if (result.hasErrors()) { return result.getAllErrors().get(0).getDefaultMessage(); } return "參數(shù)不可為空!"; } }
5. 定義Dto,在參數(shù)上添加注解校驗
@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 數(shù)據(jù)過大") @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驗證框架”這篇文章對大家有幫助,同時也希望大家多多支持億速云,關注億速云行業(yè)資訊頻道,更多相關知識等著你來學習!
免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權內(nèi)容。