Bean Validation是JSR303的定义,Hibernate Validator是对BeanValidation的实现,同时附加了几个本身的注解。java
Bean Validation 中内置的 constraint @Null 被注释的元素必须为 null @NotNull 被注释的元素必须不为 null @AssertTrue 被注释的元素必须为 true @AssertFalse 被注释的元素必须为 false @Min(value) 被注释的元素必须是一个数字,其值必须大于等于指定的最小值 @Max(value) 被注释的元素必须是一个数字,其值必须小于等于指定的最大值 @DecimalMin(value) 被注释的元素必须是一个数字,其值必须大于等于指定的最小值 @DecimalMax(value) 被注释的元素必须是一个数字,其值必须小于等于指定的最大值 @Size(max=, min=) 被注释的元素的大小必须在指定的范围内 @Digits (integer, fraction) 被注释的元素必须是一个数字,其值必须在可接受的范围内 @Past 被注释的元素必须是一个过去的日期 @Future 被注释的元素必须是一个未来的日期 @Pattern(regex=,flag=) 被注释的元素必须符合指定的正则表达式 Hibernate Validator 附加的 constraint @NotBlank(message =) 验证字符串非null,且长度必须大于0 @Email 被注释的元素必须是电子邮箱地址 @Length(min=,max=) 被注释的字符串的大小必须在指定的范围内 @NotEmpty 被注释的字符串的必须非空 @Range(min=,max=,message=) 被注释的元素必须在合适的范围内
1.pom文件git
<dependency> <groupId>javax.el</groupId> <artifactId>javax.el-api</artifactId> <version>2.2.4</version> </dependency> <dependency> <groupId>org.glassfish.web</groupId> <artifactId>javax.el</artifactId> <version>2.2.4</version> </dependency>
2.Beanweb
public class Student { interface GroupA {} interface GroupB {} interface GroupC {} @NotNull(message = "姓名不能为空", groups = GroupA.class) private String name; private int age; @Range(min = 1, max = 2, groups = GroupB.class) private Double money; @Size(min = 1, max = 3) private String address; @Size(min = 1, max = 2, groups = GroupC.class) private List<String> registerClass; @Email(groups = GroupB.class) private String email;
3.验证代码正则表达式
public static void main(String[] args) { Student student = new Student(); //student.setName("Tom"); student.setAddress("浙江省杭州市"); student.setAge(101); student.setMoney(101D); student.setEmail("as"); student.setRegisterClass(Lists.newArrayList("Englist","Math","haha")); ValidatorFactory factory = Validation.buildDefaultValidatorFactory(); Validator validator = factory.getValidator(); Set<ConstraintViolation<Student>> constraintViolationSet = validator.validate(student, GroupA.class,GroupB.class); for (ConstraintViolation<Student> constraintViolation : constraintViolationSet) { System.out.println(constraintViolation.getPropertyPath() + constraintViolation.getMessage()); } }
除了支持基本已经实现的验证功能以外,还支持分组,针对不一样组进行验证。api
下面实现一个Validator,目的是检测一个List里面的全部元素在必定的范围,若是超过必定的范围或者不是Number类型的就返回提示bash
1.定义一个validator注解app
@Constraint(validatedBy = CheckListRangeValidator.class) @Target({ElementType.FIELD, ElementType.METHOD}) @Retention(RetentionPolicy.RUNTIME) @Documented public @interface CheckListRange { String message() default "{List里面的元素必须大于min 小于max}"; int min() default Integer.MIN_VALUE; int max() default Integer.MAX_VALUE; Class<?>[] groups() default {}; Class<? extends Payload>[] payload() default {}; }
2.validator的实现ui
public class CheckListRangeValidator implements ConstraintValidator<CheckListRange, List> { private int min; private int max; public void initialize(CheckListRange constraintAnnotation) { this.min = constraintAnnotation.min(); this.max = constraintAnnotation.max(); } public boolean isValid(List value, ConstraintValidatorContext context) { for (Object object : value) { if (object == null || !(object instanceof Number)) { return false; } if (((Number)object).doubleValue() < min || ((Number)object).doubleValue() > max) { return false; } return true; } return false; } }
3.Bean里面使用自定义validator注解this
public class Student { interface GroupA {} interface GroupB {} interface GroupC {} @NotNull(message = "姓名不能为空", groups = GroupC.class) private String name; private int age; @Range(min = 1, max = 2, groups = GroupB.class) private Double money; @Size(min = 1, max = 3) private String address; @Size(min = 1, max = 2, groups = GroupC.class) private List<String> registerClass; @Email(groups = GroupB.class) private String email; @CheckListRange(min = 1, max = 100, message = "List中元素必须在大于等于1,小于等于100", groups = GroupC.class) //当使用自定义注解的时候必定要加上@Valid否则不会被识别 @Valid private List<? extends Number> scoreList; }
4.检测代码spa
public class MainTest { public static void main(String[] args) { Student student = new Student(); //student.setName("Tom"); student.setAddress("浙江省杭州市"); student.setAge(101); student.setMoney(101D); student.setEmail("as"); student.setRegisterClass(Lists.newArrayList("Englist","Math","haha")); student.setScoreList(Lists.newArrayList(-1.1D,3D,3D,3D)); ValidatorFactory factory = Validation.buildDefaultValidatorFactory(); Validator validator = factory.getValidator(); Set<ConstraintViolation<Student>> constraintViolationSet = validator.validate(student, GroupC.class); for (ConstraintViolation<Student> constraintViolation : constraintViolationSet) { System.out.println(constraintViolation.getPropertyPath() + constraintViolation.getMessage()); } } }
5.最后结果
四月 01, 2017 2:36:54 下午 org.hibernate.validator.internal.util.Version <clinit> INFO: HV000001: Hibernate Validator 5.3.4.Final name姓名不能为空 scoreListList中元素必须在大于等于1,小于等于100 registerClass个数必须在1和2之间 Process finished with exit code 0
5、Spring MVC中的使用
/** * 备注:此处@Validated(PersonAddView.class) 表示使用PersonAndView这套校验规则,若使用@Valid 则表示使用默认校验规则, @RequestMapping(value = "/student", method = RequestMethod.POST) public void addStudent(@RequestBody @Validated({GroupC.class}) Student student) { System.out.println(student.toString()); } /** * 修改Person对象 * 此处启用PersonModifyView 这个验证规则 */ @RequestMapping(value = "/student", method = RequestMethod.PUT) public void modifyStudent(@RequestBody @Validated(value = {GroupA.class}) Student student) { System.out.println(student.toString()); }