前言
平常開(kāi)發(fā)接口中囊蓝,有大量重復(fù)的參數(shù)合法性校驗(yàn)饿悬,例如:
@GetMapping("/query")
public Result query(QueryDTO queryDTO) {
if (queryDTO.getId() == null){
return Result.error("請(qǐng)求 ID 為空");
} else if (StringUtils.isEmpty(queryDTO.getName())){
return Result.error("請(qǐng)求 NAME 為空");
}
// 業(yè)務(wù)邏輯
}
參數(shù)眾多,校驗(yàn)方式也各為不同聚霜,代碼難免變得臃腫狡恬。
Spring Validation
Spring Validation 是一種基于 Spring 的參數(shù)校驗(yàn)工具珠叔,常用于 Spring MVC 中 Controller 的參數(shù)處理。常用校驗(yàn)注解如下:
注解 | 說(shuō)明 |
---|---|
@Null | 限制只能為null |
@NotNull | 限制必須不為null |
@Max(value) | 限制必須為一個(gè)不大于指定值的數(shù)字 |
@Min(value) | 限制必須為一個(gè)不小于指定值的數(shù)字 |
@Pattern(value) | 限制必須符合指定的正則表達(dá)式 |
@Size(max,min) | 限制字符長(zhǎng)度必須在min到max之間 |
@NotEmpty | 驗(yàn)證注解的元素值不為null且不為空(字符串長(zhǎng)度不為0弟劲、集合大小不為0) |
@NotBlank | 驗(yàn)證注解的元素值不為空(不為null祷安、去除首位空格后長(zhǎng)度為0),不同于@NotEmpty兔乞,@NotBlank只應(yīng)用于字符串且在比較時(shí)會(huì)去除字符串的空格 |
驗(yàn)證注解的元素值是Email汇鞭,也可以通過(guò)正則表達(dá)式和flag指定自定義的email格式 | |
@AssertFalse | 限制必須為false |
@AssertTrue | 限制必須為true |
@DecimalMax(value) | 限制必須為一個(gè)不大于指定值的數(shù)字 |
@DecimalMin(value) | 限制必須為一個(gè)不小于指定值的數(shù)字 |
@Digits(integer,fraction) | 限制必須為一個(gè)小數(shù),且整數(shù)部分的位數(shù)不能超過(guò)integer报嵌,小數(shù)部分的位數(shù)不能超過(guò)fraction |
@Future | 限制必須是一個(gè)將來(lái)的日期 |
@Past | 限制必須是一個(gè)過(guò)去的日期 |
使用 Spring Validation 需要添加依賴:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-validation</artifactId>
</dependency>
使用 BindingResult
BindingResult 用于收集 validation 校驗(yàn)結(jié)果信息虱咧,例:
@GetMapping("/query")
public Result query(@Valid QueryDTO queryDTO, BindingResult bindingResult) {
if (bindingResult.hasErrors()){
return Result.error("未知異常");
}
// 業(yè)務(wù)邏輯
}
全局異常捕獲
@RestControllerAdvice
public class GlobalExceptionHandler {
@ExceptionHandler(BindException.class)
public Object handleBindException(BindException ex) {
FieldError fieldError = ex.getFieldError();
return Result.error(fieldError.getDefaultMessage());
}
}
自定義校驗(yàn)器
自定義注解
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
// 指定注解處理類
@Constraint(validatedBy = MyValidation.class)
public @interface MyAnnotation {
String message();
Class<?>[] groups() default {};
Class<? extends Payload>[] payload() default {};
}
注解處理類
public class MyValidation implements ConstraintValidator<MyAnnotation, String> {
@Override
public boolean isValid(String value, ConstraintValidatorContext constraintValidatorContext) {
// 自定義校驗(yàn)邏輯
return true;
}
}