spring-boot-starter-validation进行参数校验!
优点
- controller层的代码看起来干净整洁
- spring-boot-starter-validation本身内置了一些注解可以直接使用,比如@NotNull,@NotBlank,@Size等
- 支持自定义注解,灵活方便
搭建
pom引入依赖包
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-validationartifactId>
dependency>
常用注解
@NotNull
@NotBlank
@NotEmpty
@Size
自定义注解
@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.PARAMETER,ElementType.FIELD})
@Constraint(validatedBy = DateValidator.Validator.class)
public @interface DateValidator {
// 校验未通过时的返回信息
String message() default "日期格式不正确";
// 以下两行为固定模板
Class<?>[] groups() default {};
Class<? extends Payload>[] payload() default {};
String expectValue();
@Slf4j
class Validator implements ConstraintValidator<DateValidator, String> {
private String expectValue;
@Override
public void initialize(DateValidator dateValidator) {
expectValue = dateValidator.expectValue();
}
@Override
public boolean isValid(String value, ConstraintValidatorContext context) {
boolean flag = false;
if(Strings.isNullOrEmpty(value)){
return true;
}
try {
Date date = DateUtil.formatStr2Date(value, expectValue);
flag = true;
}catch (RuntimeException e){
log.warn("DateValidator 日期格式不正确");
e.printStackTrace();
}
return flag;
}
}
}
测试
注意点
校验不通过时,会直接抛出异常,程序将停止执行下面的逻辑,这样是不合理的,所以我们要捕获异常,并进行处理,方案如下: 全局捕获异常,并统一返回:
@ControllerAdvice
@Slf4j
public class GlobalExceptionHandler {
@ExceptionHandler(MethodArgumentNotValidException.class)
@ResponseBody
public R exceptionHandler(MethodArgumentNotValidException e) {
log.error("exceptionHandler info:", e);
BindingResult bindingResult = e.getBindingResult();
StringBuilder builder = new StringBuilder();
for (FieldError fieldError : bindingResult.getFieldErrors()) {
builder.append(fieldError.getDefaultMessage()).append("!");
}
log.error("message : {}",builder.toString());
return new R("500",builder.toString());
}
}