介绍
在项目开发当中,数据校验是你必须要考虑和面对的事情,为此要写上一大串的代码进行校验,这样就会导致代码冗余和一些管理的问题。
例如下面的代码:
1 public void push(ListuserList, String url, String content) {2 Preconditions.checkArgument(CollectionUtils.isNotEmpty(userList), "用户列表不能为空");3 Preconditions.checkArgument(StringUtils.isNotEmpty(url), "推送url不能为空");4 Preconditions.checkArgument(StringUtils.isNotEmpty(content), "推送内容不能为空");5 }
validation可以做以下事情
validation可以抛出统一的参数校验异常,方便定位问题
编程简单,只需要注解就能搞定,不需要编写大量的代码
validation提供以下注解:
使用
添加JAR包依赖
1
2 javax.validation
3 validation-api
4 1.1.0.Final
5
6
7
8 org.hibernate
9 hibernate-validator
10 5.2.0.Final
11
一、简单的参数校验
1 public classUserBean {2 @Range(min = 20, max = 50, message = "age应该在[20,50]之间")3 privateInteger age;4
5 @NotNull(message = "name不能为空")6 privateString name;7
8 @Length(max = 100, message = "address不能超过100")9 privateString address;10
11 @Email(message = "email格式不对")12 privateString email;13
14
15 publicInteger getAge() {16 returnage;17 }18
19 public voidsetAge(Integer age) {20 this.age =age;21 }22
23 publicString getName() {24 returnname;25 }26
27 public voidsetName(String name) {28 this.name =name;29 }30
31 publicString getAddress() {32 returnaddress;33 }34
35 public voidsetAddress(String address) {36 this.address =address;37 }38
39
40 publicString getEmail() {41 returnemail;42 }43
44 public voidsetEmail(String email) {45 this.email =email;46 }47
48 }
创建对象验证器
1 /**
2 * 对象验证器3 *4 * Created by Albert on 18/1/25.5 */
6 public classBeanValidator {7
8 /**
9 * 验证某个bean的参数10 *11 *@paramobject 被校验的参数12 *@throwsValidationException 如果参数校验不成功则抛出此异常13 */
14 public static voidvalidate(T object) {15 //获得验证器
16 Validator validator =Validation.buildDefaultValidatorFactory().getValidator();17 //执行验证
18 Set> constraintViolations =validator.validate(object);19 //如果有验证信息,则取出来包装成异常返回
20 if(CollectionUtils.isEmpty(constraintViolations)) {21 return;22 }23 throw newValidationException(convertErrorMsg(constraintViolations));24 }25
26 /**
27 * 转换异常信息28 *@paramset29 *@param30 *@return
31 */
32 private static String convertErrorMsg(Set>set) {33 Map errorMap = new HashMap<>();34 String property;35 for (ConstraintViolationcv : set) {36 //这里循环获取错误信息,可以自定义格式
37 property =cv.getPropertyPath().toString();38 if (errorMap.get(property) != null) {39 errorMap.get(property).append("," +cv.getMessage());40 } else{41 StringBuilder sb = newStringBuilder();42 sb.append(cv.getMessage());43 errorMap.put(property, sb);44 }45 }46 returnerrorMap.toString();47 }48 }
编写测试类
1 public classValidatorTest {2
3 public static voidmain(String[] args) {4 UserBean userBean = newUserBean();5 userBean.setAge(12);6 userBean.setName("张三");7 userBean.setAddress("124444444112");8 userBean.setEmail("123");9
10 BeanValidator.validate(userBean);11 }12 }
运行结果
二、自定义验证器
定义注解,message、groups和payload三个属性是必须定义的。
1 @Target({ElementType.FIELD, ElementType.METHOD})2 @Retention(RetentionPolicy.RUNTIME)3 @Constraint(validatedBy = ZipCodeValidator.class)4 public @interfaceZipCode {5 String message() default "";6 Class>[] groups() default{};7 Class extends Payload>[] payload() default{};8 }
定义验证类
1 public class ZipCodeValidator implements ConstraintValidator{2
3 private String zipCodeReg = "[1-9]d{5}(?!d)";//表示邮编的正则表达式
4 private Pattern zipCodePattern =Pattern.compile(zipCodeReg);5
6
7 @Override8 public voidinitialize(ZipCode zipCode) {9
10 }11
12 @Override13 public booleanisValid(String val, ConstraintValidatorContext constraintValidatorContext) {14 if(val == null) {15 return true;16 }17 returnzipCodePattern.matcher(val).matches();18 }19 }
UserBean 加入以下代码
1 @ZipCode(message = "邮编格式错误")2 privateString zipCode;3
4 publicString getZipCode() {5 returnzipCode;6 }7
8 public voidsetZipCode(String zipCode) {9 this.zipCode =zipCode;10 }
编写测试类
1 public classValidatorTest {2
3 public static voidmain(String[] args) {4 UserBean userBean = newUserBean();5 userBean.setAge(12);6 userBean.setName("张三");7 userBean.setAddress("124444444112");8 userBean.setEmail("123");9
10 userBean.setZipCode("000111");11 BeanValidator.validate(userBean);12 }13 }
运行结果
结语
本文只列举了部分常用的校验方法,还有更多的使用方式,就不在这里一一列举了。