常用注解
- @AssertFalse 所注解的元素必须是Boolean类型,且值为false
- @AssertTrue 所注解的元素必须是Boolean类型,且值为true
- @DecimalMax 所注解的元素必须是数字,且值小于等于给定的值
- @DecimalMin 所注解的元素必须是数字,且值大于等于给定的值
- @Digits 所注解的元素必须是数字,且值必须是指定的位数
- @Future 所注解的元素必须是将来某个日期
- @Max 所注解的元素必须是数字,且值小于等于给定的值
- @Min 所注解的元素必须是数字,且值小于等于给定的值
- @Range 所注解的元素需在指定范围区间内
- @NotNull 所注解的元素值不能为null
- @NotBlank 所注解的元素值有内容
- @Null 所注解的元素值为null
- @Past 所注解的元素必须是某个过去的日期
- @PastOrPresent 所注解的元素必须是过去某个或现在日期
- @Pattern 所注解的元素必须满足给定的正则表达式
- @Size 所注解的元素必须是String、集合或数组,且长度大小需保证在给定范围之内
- @Email 所注解的元素需满足Email格式
自定义注解
import javax.validation.Constraint;
import javax.validation.Payload;
import java.lang.annotation.*;
@Documented
@Target({ElementType.FIELD, ElementType.PARAMETER})
@Retention(RetentionPolicy.RUNTIME)
@Constraint(validatedBy = PhoneValidator.class)
public @interface CheckPhone {
String message() default "手机格式不合法";
Class<?>[] groups() default {};
Class<? extends Payload>[] payload() default {};
}
@Constraint(validatedBy = PhoneValidator.class) 指定这个注解校验的类
自定义校验类
import javax.validation.ConstraintValidator;
import javax.validation.ConstraintValidatorContext;
import java.util.regex.Pattern;
/**
* 手机号码校验器
*
* @author sun 2020/7/21 16:36
*/
public class PhoneValidator implements ConstraintValidator<CheckPhone,String> {
@Override
public boolean isValid(String phone, ConstraintValidatorContext constraintValidatorContext) {
if (phone.length() != 11) {
return false;
}
// 移动号段正则表达式
Pattern pattern = Pattern.compile("^((13[4-9])|(147)|(15[0-2,7-9])|(178)|(18[2-4,7-8]))\\d{8}|(1705)\\d{7}$");
if (pattern.matcher(phone).matches()) {
return true;
}
// 联通号段正则表达式
pattern = Pattern.compile("^((13[0-2])|(145)|(15[5-6])|(176)|(18[5,6]))\\d{8}|(1709)\\d{7}$");
if (pattern.matcher(phone).matches()) {
return true;
}
// 电信号段正则表达式
pattern = Pattern.compile("^((133)|(153)|(177)|(18[0,1,9])|(149))\\d{8}$");
if (pattern.matcher(phone).matches()) {
return true;
}
//虚拟运营商正则表达式
pattern = Pattern.compile("^((170))\\d{8}|(1718)|(1719)\\d{7}$");
return pattern.matcher(phone).matches();
}
}
全局异常捕获
格式化输出异常
import javax.validation.ConstraintViolation;
import javax.validation.ConstraintViolationException;
import java.util.Set;
/**
* 全局异常处理类
*
* @author sun
*/
@RestControllerAdvice
public class GlobalExceptionHandler {
/**
* 参数校验全局异常
*/
@ExceptionHandler(ConstraintViolationException.class)
public Result handlerValidator(ConstraintViolationException constraintViolationException) {
Set<ConstraintViolation<?>> constraintViolationSets = constraintViolationException.getConstraintViolations();
// Result的为我自定义的全局响应对象
// constraintViolationSets.iterator().next().getMessage()为错误信息
return Result.fail(constraintViolationSets.iterator().next().getMessage());
}
}
用法
如果是单个字段的校验,需要再当前类上加校验注解
import org.springframework.validation.annotation.Validated;
可以了