有时候同一个请求对象会在多个场景的接口中使用,不同业务场景对请求对象的参数校验需求不同,可以使用分组校验来解决.
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
如果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 {
@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 被注释的字符串必须非空