
SpringBoot檢驗(yàn)注解
@Null 限制只能為null。
@NotNull 限制必須不為null。
@NotEmpty 只作用于字符串類型,字符串不為空,并且長度不為0。
@NotBlank 只作用于字符串類型,字符串不為空,并且trim()后不為空串。
@AssertFalse 限制必須為false。
@AssertTrue 限制必須為true。
@DecimalMax(value) 限制必須為一個(gè)不大于指定值的數(shù)字。
@DecimalMin(value) 限制必須為一個(gè)不小于指定值的數(shù)字。
@Digits(integer,fraction) 限制必須為一個(gè)小數(shù),且整數(shù)部分的位數(shù)不能超過integer,小數(shù)部分的位數(shù)不能超過fraction。
@Future 限制必須是一個(gè)將來的日期。
@Past 驗(yàn)證注解的元素值(日期類型)比當(dāng)前時(shí)間早。
@Max(value) 限制必須為一個(gè)不大于指定值的數(shù)字。
@Min(value) 限制必須為一個(gè)不小于指定值的數(shù)字。
@Pattern(value) 限制必須符合指定的正則表達(dá)式。
@Size(max,min) 限制字符長度必須在min到max之間。
@Email 驗(yàn)證注解的元素值是Email,也可以通過正則表達(dá)式和flag指定自定義的email格式。
注意:
@NotNull 適用于任何類型被注解的元素必須不能與NULL。
@NotEmpty 適用于String Map或者數(shù)組不能為Null且長度必須大于0。
@NotBlank 只能用于String上面 不能為null,調(diào)用trim()后,長度必須大于0。
單個(gè)參數(shù)校驗(yàn)
@RestController
@RequestMapping("validator/")
@Validated
public class ValidatorController {
@GetMapping("/add")
public String add(@NotNull(message = "address不能為空") String address) {
return "檢驗(yàn)通過";
}
}
請(qǐng)求:127.0.0.1:8080/validator/add?address=中國。
返回:檢驗(yàn)通過。
請(qǐng)求:127.0.0.1:8080/validator/add。
返回:address不能為空。
說明:在進(jìn)行單個(gè)參數(shù)校驗(yàn)時(shí),一定要在Controler類上加@Validated注解,否則校驗(yàn)不會(huì)生效。
實(shí)體類參數(shù)校驗(yàn)
實(shí)體User類:
public class User {
@NotBlank(message = "請(qǐng)輸入名稱")
@Length(message = "名稱不能超過個(gè) {max} 字符", max = 5)
public String name;
@NotNull(message = "請(qǐng)輸入年齡")
@Range(message = "年齡范圍為 {min} 到 {max} 之間", min = 1, max = 100)
public Integer age;
public String getName() {return name;}
public void setName(String name) {this.name = name;}
public Integer getAge() {return age;}
public void setAge(Integer age) {this.age = age;}
}
controller類:
@RestController
@RequestMapping("validator/")
public class ValidatorController {
@PostMapping("/add")
public String addUser(@RequestBody @Valid User user, BindingResult bindingResult) {
//查看所有字段是否驗(yàn)證通過
if (bindingResult.hasErrors()) {
//返回第一條錯(cuò)誤信息
return bindingResult.getAllErrors().get(0).getDefaultMessage();
}
return "檢驗(yàn)通過";
}
}
執(zhí)行如下:


說明:如果采用BindingResult方式來存儲(chǔ)異常結(jié)果,就必須自己來處理異常。即接口中有BindingResult參數(shù),就必須使用要有上方7,8,9行代碼進(jìn)行異常處理,否則程序會(huì)正常執(zhí)行。
統(tǒng)一異常管理
實(shí)體User類,同上。controller類如下:
@RequestMapping("validator/")
public class ValidatorController {
@PostMapping("/add")
public String addUser(@Valid @RequestBody User user) {
return "檢驗(yàn)通過";
}
}
執(zhí)行結(jié)果:

這里沒有采用BindingResult來存儲(chǔ)異常,程序在這里會(huì)報(bào)錯(cuò)??梢栽谶@個(gè)地方增加統(tǒng)一異常管理。通過報(bào)錯(cuò)信息可以知道需要對(duì)MethodArgumentNotValidException進(jìn)行管理,代碼如下:
@RestControllerAdvice
public class ValidatedExceptionHander {
@ExceptionHandler(MethodArgumentNotValidException.class)
public String MethodArgumentNotValidHandler(MethodArgumentNotValidException exception) {
String exceptionInfo = exception.getBindingResult().getAllErrors().get(0).getDefaultMessage();
return exceptionInfo;
}
}
再次執(zhí)行:

使用spring boot校驗(yàn)器
檢驗(yàn)器代碼:
@Component
public class ValidatorUtil implements ApplicationContextAware {
// 通過Spring獲得校驗(yàn)器
private static Validator validator;
@Override
public void setApplicationContext(ApplicationContext applicationContext){
Validator validatorBean = applicationContext.getBean(Validator.class);
setValidator(validatorBean);
}
public static void setValidator(Validator validatorBean){
if (validatorBean instanceof LocalValidatorFactoryBean) {
validator = ((LocalValidatorFactoryBean) validatorBean).getValidator();
} else if (validatorBean instanceof SpringValidatorAdapter) {
validator = validatorBean.unwrap(Validator.class);
} else {
validator = validatorBean;
}
}
public static <T> void validate(T object){
Set<ConstraintViolation<T>> violationSet = validator.validate(object);
for (ConstraintViolation<T> violation : violationSet) {
throw new ValidationException(violation.getMessage());
}
}
}
統(tǒng)一異常管理:
@RestControllerAdvice
public class ValidatedExceptionHander {
@ExceptionHandler(value = ValidationException.class)
public String ValidationException(ValidationException exception) {
return exception.getMessage();
}
}
controller類如下:
@RestController
@RequestMapping("validator/")
public class ValidatorController {
@PostMapping("/add")
public String addUser(@RequestBody User user) {
ValidatorUtil.validate(user);
return "檢驗(yàn)通過";
}
}
執(zhí)行如下:

說明:這么做的好處是可以自由的對(duì)實(shí)體進(jìn)行檢驗(yàn),與以上方式相比較為靈活。
分組校驗(yàn)
同一個(gè)實(shí)體在不同的操作中的校驗(yàn)方式是不同的,這就要用到分組校驗(yàn)。比如實(shí)體User在新增操作時(shí),id是沒有的,但是在更新操作時(shí)id又必須存在。通過下面例子來講解一下是如何實(shí)現(xiàn)的。
實(shí)體user:
public class User {
@NotNull(message = "id不能為空", groups = {User.UpdateGroup.class})
@Null(message = "id必須為空", groups = {User.InsertGroup.class})
public Integer id;
@NotBlank(message = "請(qǐng)輸入名稱")
@Length(message = "名稱不能超過個(gè) {max} 字符", max = 5)
public String name;
@NotNull(message = "請(qǐng)輸入年齡")
@Range(message = "年齡范圍為 {min} 到 {max} 之間", min = 1, max = 100)
public Integer age;
public Integer getId() {return id;}
public void setId(Integer id) {this.id = id;}
public String getName() {return name;}
public void setName(String name) {this.name = name;}
public Integer getAge() {return age;}
public void setAge(Integer age) {this.age = age;}
public interface InsertGroup{}
public interface UpdateGroup{}
}
統(tǒng)一異常:
@RestControllerAdvice
public class ValidatedExceptionHander {
@ExceptionHandler(MethodArgumentNotValidException.class)
public String MethodArgumentNotValidHandler(MethodArgumentNotValidException exception) {
String exceptionInfo = exception.getBindingResult().getAllErrors().get(0).getDefaultMessage();
return exceptionInfo;
}
}
controller類:
@RestController
@RequestMapping("validator/")
public class ValidatorController {
@GetMapping("/update")
public String updateUser(@Validated(User.UpdateGroup.class) @RequestBody User user) {
return "更新成功";
}
@GetMapping("/insert")
public String insertUser(@Validated(User.InsertGroup.class) @RequestBody User user) {
return "保存成功";
}
}
執(zhí)行如下:


@Validated和@Valid區(qū)別
@Validated 對(duì)@Valid 進(jìn)行了二次封裝,但在分組、注解位置、嵌套驗(yàn)證等功能上有所不同。
不同點(diǎn) | @Valid | @Validated |
來源 | 是Hibernate validation 的 校驗(yàn)注解 | 是 Spring Validator 的校驗(yàn)注解,是 Hibernate validation 基礎(chǔ)上的增加版 |
注解位置 | 用在 構(gòu)造函數(shù)、方法、方法參數(shù) 和 成員屬性上 | 用在 類、方法和方法參數(shù)上。但不能用于成員屬性 |
嵌套驗(yàn)證 | 用在級(jí)聯(lián)對(duì)象的成員屬性上面 | 不支持 |
分組 | 無此功能 | 提供分組功能,可以在入?yún)Ⅱ?yàn)證時(shí),根據(jù)不同的分組采用不同的驗(yàn)證機(jī)制 |