分组校验
需求:保存用户时,id可以为空;更新用户时,id不能为空
定义两个接口
public interface Save { } public interface Update { }
定义需要校验的对象
public class User implements Serializable{ // 约束注解上声明分组信息groups @NotNull(groups = {Update.class}) private Long id; @NotBlank(groups = {Update.class,Save.class,}) private String name; @NotBlank(groups = {Update.class,Save.class}) private String college; }
@Validated
注解上指定校验分组@RequestMapping("/saveUser") // 校验通过,才会执行业务逻辑处理 public String save(@Validated(Save.class) User user){ return "保存时不校验"; } @RequestMapping("/updateUser") public String update(@Validated(Update.class) User user){ return "更新时校验"; }
自定义校验
需求:自定义手机号校验
定义约束注解
@Target({METHOD, FIELD,PARAMETER}) @Retention(RUNTIME) @Documented @Constraint(validatedBy = {PhoneNumberValidator.class}) public @interface PhoneNumber { // 默认错误消息 String message() default "手机号不合法"; // 分组 Class<?>[] groups() default {}; // 负载 Class<? extends Payload>[] payload() default {}; }
实现
ConstraintValidator
接口编写校验规则public class PhoneNumberValidator implements ConstraintValidator<PhoneNumber, String> { // String:要校验的对象类型 private static final Pattern PATTERN = Pattern.compile("^((13[0-9])|(15[^4,\D])|(18[0,5-9]))\d{8}$"); @Override public boolean isValid(String value, ConstraintValidatorContext context) { if (value != null) { Matcher matcher = PATTERN.matcher(value); return matcher.find(); } return true; } }
测试
@RequestMapping("/validted") public String validted(@Validated @PhoneNumber String number){ // 校验通过,才会执行业务逻辑处理 return "手机号合法"; }