有时候同一个请求对象会在多个场景的接口中使用,不同业务场景对请求对象的参数校验需求不同,可以使用分组校验来解决.

public class User implements Serializable {

    // 添加2个空接口,用例标记参数校验规则
    /**
     * 注册校验规则
     */
    public interface UserRegisterValidView {
    }

    /**
     * 登录校验规则
     */
    public interface UserLoginValidView {
    }

    private static final long serialVersionUID = 1L;

    @NotBlank(message = "用户名不能为空")
    private String userName;

    @NotBlank(message = "密码不能为空")
    private String password;

    // 若填写了groups,则该参数验证只在对应验证规则下启用
    @Past(groups = { UserRegisterValidView.class }, message = "出生日期不符合要求")
    private Date birthday;

    @DecimalMin(value = "0.1", message = "金额最低为0.1")
    @NotNull(message = "金额不能为空")
    private BigDecimal balance;

    @AssertTrue(groups = { UserRegisterValidView.class, UserLoginValidView.class }, message = "标记必须为true")
    private boolean flag;

    @Min(value = 18, message = "年龄不能小于18")
    private Integer age;
}

在Controller中需要在@Validated里加上分组

public ResponseMessage<Object> register(@RequestBody @Validated(User.UserRegisterValidView.class) User user ){
        ResponseMessage<Object> message = new ResponseMessage();
        //do something
        return message;
    }

如果jar包中没有规则校验,自己定义:

@Target({ METHOD, FIELD, ANNOTATION_TYPE, CONSTRUCTOR, PARAMETER })
@Retention(RUNTIME)
@Documented
@Constraint(validatedBy = IsQQEmailImpl.class) // 指明自定义注解的实现类
public @interface IsQQEmail {

    String message() default "email is invalid";

    Class<?>[] groups() default {};

    Class<? extends Payload>[] payload() default {};

    @Target({ METHOD, FIELD, ANNOTATION_TYPE, CONSTRUCTOR, PARAMETER })
    @Retention(RUNTIME)
    @Documented
    public @interface List {
        IsQQEmail[] value();
    }
}

实现:

public class IsQQEmailImpl implements ConstraintValidator<IsQQEmail, String> {

    @Override
    public void initialize(IsQQEmail isQQEamil) {
        // TODO Auto-generated method stub
    }

    @Override
    public boolean isValid(String value, ConstraintValidatorContext context) {
        // TODO Auto-generated method stub
        if (value == null) {
            return false;
        }
        // 进行QQ邮箱格式的简单判断,实际开发用正则
        if (value.endsWith("@qq.com") || value.endsWith("@QQ.COM")) {
            return true;
        }
        return false;
    }

}

 加在对象属性上

public class User implements Serializable {
    @IsQQEmail(message = "邮箱错误")
    private String email;
}

下面是Jar包支持的校验

@Min                                               验证 Number 和 String 对象是否大等于指定的值    
@Max                                              验证 Number 和 String 对象是否小等于指定的值    
@DecimalMax                                 被标注的值必须不大于约束中指定的最大值. 这个约束的参数是一个通过BigDecimal定义的最大值的字符串表示.小数存在精度  
@DecimalMin                                  被标注的值必须不小于约束中指定的最小值. 这个约束的参数是一个通过BigDecimal定义的最小值的字符串表示.小数存在精度  
@Digits                                             验证 Number 和 String 的构成是否合法    
@Digits(integer=,fraction=)              验证字符串是否是符合指定格式的数字,interger指定整数精度,fraction指定小数精度。
@Valid                                             递归的对关联对象进行校验, 如果关联对象是个集合或者数组,那么对其中的元素进行递归校验,如果是一个map,则对其中的值部分进行校验.(是否进行递归验证)  
@CreditCardNumber                       信用卡验证  
@Email                                            验证是否是邮件地址,如果为null,不进行验证,算通过验证。  
@ScriptAssert(lang= ,script=, alias=)  
@URL(protocol=,host=, port=,regexp=, flags=)  
@Range(min=10000,max=50000,message="range.bean.wage")  被注释的元素必须在合适的范围
@Size(max,min)                              被注释的元素大小必须在指定范围内
@Past                                              被注释的元素必须是一个过去的日期
@Future                                           被注释的元素必须是一个将来的日期
@Pattern(value)                              被注释的元素必须符合指定的正则表达式
@Null                                               被注释的元素必须为null
@NotNull                                         被注释的元素必须不为null
@AssertTrue                                    被注释元素必须为true
@AssertFalse                                  被注释元素必须为false
@Length                                          被注释的字符串的大小必须在指定的范围内
@NotEmpty                                      被注释的字符串必须非空