Spring 使用Validation 驗(yàn)證框架的問題詳解
一、介紹
Spring Validation 驗(yàn)證框架對參數(shù)的驗(yàn)證機(jī)制提供了@Validated (Spring's JSR-303 規(guī)范,是標(biāo)準(zhǔn) JSR-303 的一個變種),javax 提供了@Valid(標(biāo)準(zhǔn) JSR-303 規(guī)范),配合 BindingResult 可以直接提供參數(shù)驗(yàn)證結(jié)果。其中對于字段的特定驗(yàn)證注解,比如 @NotNull。
兩者在檢驗(yàn) Controller 的入?yún)⑹欠穹弦?guī)范時,使用@Validated 或者 @Valid 在基本驗(yàn)證功能上沒有太多區(qū)別。但是在分組、注解地方、嵌套驗(yàn)證等功能上兩個有所不同:
1.@Validated
分組:提供分組功能,可在入?yún)Ⅱ?yàn)證時,根據(jù)不同的分組采用不同的驗(yàn)證機(jī)制。
可注解位置:可以用在類型、方法和方法參數(shù)上。但是不能用在成員屬性上
嵌套驗(yàn)證:用在方法入?yún)⑸蠠o法單獨(dú)提供嵌套驗(yàn)證功能;不能用在成員屬性上;也無法提供框架進(jìn)行嵌套驗(yàn)證;能配合嵌套驗(yàn)證注解 @Valid 進(jìn)行嵌套驗(yàn)證。
2.@Valid
分組:無分組功能
可注解位置:可以用在方法、構(gòu)造函數(shù)、方法參數(shù)和成員屬性上(兩者是否能用于成員屬性上直接影響能否提供嵌套驗(yàn)證的功能)
嵌套驗(yàn)證:用在方法入?yún)⑸蠠o法單獨(dú)提供嵌套驗(yàn)證功能;能夠用在成員屬性上,提示驗(yàn)證框架進(jìn)行嵌套驗(yàn)證;能配合嵌套驗(yàn)證注解@Valid進(jìn)行嵌套驗(yàn)證。
二、使用
1. SpringBoot 2.3.0后需要添加依賴
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-validation</artifactId> </dependency>
2. 配置 validation 使出現(xiàn)校驗(yàn)失敗即返回
@Configuration public class WebConfig { @Bean public Validator validator() { ValidatorFactory validatorFactory = Validation.byProvider(HibernateValidator.class) .configure() //failFast的意思只要出現(xiàn)校驗(yàn)失敗的情況,就立即結(jié)束校驗(yàn),不再進(jìn)行后續(xù)的校驗(yàn)。 .failFast(true) .buildValidatorFactory(); return validatorFactory.getValidator(); } @Bean public MethodValidationPostProcessor methodValidationPostProcessor() { MethodValidationPostProcessor methodValidationPostProcessor = new MethodValidationPostProcessor(); methodValidationPostProcessor.setValidator(validator()); return methodValidationPostProcessor; } }
4. 編寫全局異常捕獲,捕獲驗(yàn)證失敗,統(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ù)上添加注解校驗(yàn)
@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 = "手機(jī)號碼有誤!") 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"; } }
到此這篇關(guān)于Spring 使用Validation 驗(yàn)證框架的問題詳解的文章就介紹到這了,更多相關(guān)Spring Validation 驗(yàn)證框架內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Mybatis中使用萬能的Map傳參實(shí)現(xiàn)
在編程中,有可能遇到我們的實(shí)體類或者數(shù)據(jù)庫中表的字段或參數(shù)過多的情況,那這時候用Map傳參是比較理想的選擇,本文就詳細(xì)的介紹一下如何使用,感興趣的可以了解下2021-07-07SpringMVC整合websocket實(shí)現(xiàn)消息推送及觸發(fā)功能
這篇文章主要為大家詳細(xì)介紹了SpringMVC整合websocket實(shí)現(xiàn)消息推送及觸發(fā)功能,具有一定的參考價值,感興趣的小伙伴們可以參考一下2018-03-03Log4j 配置日志打印時區(qū)的實(shí)現(xiàn)方法
下面小編就為大家分享一篇Log4j 配置日志打印時區(qū)的方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2017-12-12關(guān)于SpingMVC的<context:component-scan>包掃描踩坑記錄
這篇文章主要介紹了關(guān)于SpingMVC的<context:component-scan>包掃描踩坑記錄,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-03-03springboot簡單實(shí)現(xiàn)單點(diǎn)登錄的示例代碼
本文主要介紹了springboot簡單實(shí)現(xiàn)單點(diǎn)登錄的示例代碼,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下2022-01-01利用Spring IOC技術(shù)實(shí)現(xiàn)用戶登錄驗(yàn)證機(jī)制
這篇文章主要為大家詳細(xì)介紹了Spring IOC技術(shù)實(shí)現(xiàn)用戶登錄驗(yàn)證機(jī)制的相關(guān)資料,具有一定的參考價值,感興趣的小伙伴們可以參考一下2016-10-10