Spring 使用Validation 驗證框架的問題詳解
一、介紹
Spring Validation 驗證框架對參數(shù)的驗證機(jī)制提供了@Validated (Spring's JSR-303 規(guī)范,是標(biāo)準(zhǔn) JSR-303 的一個變種),javax 提供了@Valid(標(biāo)準(zhǔn) JSR-303 規(guī)范),配合 BindingResult 可以直接提供參數(shù)驗證結(jié)果。其中對于字段的特定驗證注解,比如 @NotNull。
兩者在檢驗 Controller 的入?yún)⑹欠穹弦?guī)范時,使用@Validated 或者 @Valid 在基本驗證功能上沒有太多區(qū)別。但是在分組、注解地方、嵌套驗證等功能上兩個有所不同:
1.@Validated
分組:提供分組功能,可在入?yún)Ⅱ炞C時,根據(jù)不同的分組采用不同的驗證機(jī)制。
可注解位置:可以用在類型、方法和方法參數(shù)上。但是不能用在成員屬性上
嵌套驗證:用在方法入?yún)⑸蠠o法單獨提供嵌套驗證功能;不能用在成員屬性上;也無法提供框架進(jìn)行嵌套驗證;能配合嵌套驗證注解 @Valid 進(jìn)行嵌套驗證。
2.@Valid
分組:無分組功能
可注解位置:可以用在方法、構(gòu)造函數(shù)、方法參數(shù)和成員屬性上(兩者是否能用于成員屬性上直接影響能否提供嵌套驗證的功能)
嵌套驗證:用在方法入?yún)⑸蠠o法單獨提供嵌套驗證功能;能夠用在成員屬性上,提示驗證框架進(jìn)行嵌套驗證;能配合嵌套驗證注解@Valid進(jìn)行嵌套驗證。
二、使用
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)校驗失敗的情況,就立即結(jié)束校驗,不再進(jì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 = "手機(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 驗證框架的問題詳解的文章就介紹到這了,更多相關(guān)Spring Validation 驗證框架內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Java?實現(xiàn)判定順序表中是否包含某個元素(思路詳解)
這篇文章主要介紹了Java?實現(xiàn)判定順序表中是否包含某個元素,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2023-06-06
java工具類static靜態(tài)方法讀取yml配置過程
文章介紹了在工具類中獲取YAML配置時遇到的問題,由于變量是靜態(tài)的,而Spring加載靜態(tài)方法比IOC容器早,導(dǎo)致無法直接使用@Value注解讀取YAML配置,從而讀取結(jié)果為null2024-11-11
Spring?Boot?中的?Native?SQL基本概念及使用方法
在本文中,我們介紹了 Spring Boot 中的 Native SQL,以及如何使用 JdbcTemplate 和 NamedParameterJdbcTemplate 來執(zhí)行自定義的 SQL 查詢或更新語句,需要的朋友跟隨小編一起看看吧2023-07-07

