简介: Java 中参数校验是一个非常常见的操作,本文将介绍使用 java 注解的方式实现参数校验
pom.xml
文件: ../pom.xml
数据校验核心依赖:
<!-- validation -->
<dependency>
<groupId>org.hibernate.validator</groupId>
<artifactId>hibernate-validator</artifactId>
<version>${hibernate.validator}</version>
</dependency>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-validator-cdi</artifactId>
<version>${hibernate.validator}</version>
</dependency>
<dependency>
<groupId>org.glassfish</groupId>
<artifactId>javax.el</artifactId>
<version>${javax.el}</version>
</dependency>
其中 ${hibernate.validator}
值为 6.0.13.Final
, ${javax.el}
的值为 3.0.1-b10
,如有新版本则使用新版本即可
其他依赖:
<!-- lombok -->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>${lombok}</version>
<scope>provided</scope>
</dependency>
lombok
注解用于生成 setter,getter,toString
等方法,使用该注解之后无需手动写以上方法
${lombok}
值为 1.18.0
com.ljq.demo.util.BeanValidateUtil
package com.ljq.demo.util;
import javax.validation.ConstraintViolation;
import javax.validation.Validation;
import javax.validation.Validator;
import javax.validation.ValidatorFactory;
import java.util.Iterator;
import java.util.Set;
/**
* @Description: java bean 校验工具类
* @Author: junqiang.lu
* @Date: 2018/9/28
*/
public class BeanValidateUtil {
private BeanValidateUtil(){}
/**
* java bean 数据校验
* 参数符合要求,返回 null,否则返回错误原因
*
* @param target 目标 bean
* @param <T>
* @return
*/
public static <T> String validate(T target){
ValidatorFactory factory = Validation.buildDefaultValidatorFactory();
Validator validator = factory.getValidator();
Set<ConstraintViolation<T>> constraintViolations = validator.validate(target);
Iterator<ConstraintViolation<T>> iterator = constraintViolations.iterator();
while (iterator.hasNext()) {
ConstraintViolation<T> error = iterator.next();
StringBuffer buffer = new StringBuffer().append("[")
.append(error.getPropertyPath().toString()).append("]")
.append(error.getMessage());
return buffer.toString();
}
return null;
}
}
com.ljq.demo.bean.ValidationDemoChildBean
package com.ljq.demo.bean;
import lombok.Data;
import javax.validation.constraints.Max;
import javax.validation.constraints.Min;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Pattern;
import java.io.Serializable;
/**
* @Description: java bean 校验引用类
* @Author: junqiang.lu
* @Date: 2018/9/28
*/
@Data
public class ValidationDemoChildBean implements Serializable {
private static final long serialVersionUID = 8313082827473756093L;
/**
* 身高,单位: cm
*/
@Min(value = 1, message = "最小值必须大于等于 1")
@Max(value = 300, message = "最大值不超过 300")
private int height;
/**
* 手机号
* 中国大陆11位手机号码,匹配格式:前三位固定格式+后8位任意数
*/
@NotNull(message = "手机号不能为空")
@Pattern(regexp = "^((13[0-9])|145|147|(15[^4])|166|(17[^2])|(17[^4])|(17[^9])|(18[0-9])|(19[8-9]))\\d{8}$",
message = "手机号不符合要求")
private String phone;
}
com.ljq.demo.bean.ValidationDemoBean
package com.ljq.demo.bean;
import lombok.Data;
import javax.validation.Valid;
import javax.validation.constraints.Email;
import javax.validation.constraints.Max;
import javax.validation.constraints.NotNull;
import java.io.Serializable;
/**
* @Description: java validation demo
* @Author: junqiang.lu
* @Date: 2018/9/28
*/
@Data
public class ValidationDemoBean implements Serializable {
private static final long serialVersionUID = -1168911794208531678L;
/**
* 用户名
*/
@NotNull(message = "用户名不能为空")
private String userName;
/**
* 年龄
*/
@Max(value = 150,message = "最大年龄不超过150岁")
private int age;
/**
* 邮箱
*/
@Email(message = "邮箱格式不正确")
private String email;
@NotNull(message = "childBean 不能为空")
@Valid
private ValidationDemoChildBean childBean;
}
com.ljq.demo.util.BeanValidateUtilTest
package com.ljq.demo.util;
import com.ljq.demo.bean.ValidationDemoBean;
import com.ljq.demo.bean.ValidationDemoChildBean;
import org.junit.Test;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.util.ArrayList;
import java.util.List;
public class BeanValidateUtilTest {
private static final Logger logger = LoggerFactory.getLogger(BeanValidateUtilTest.class);
@Test
public void validate() {
List<ValidationDemoChildBean> demoChildBeanList = new ArrayList<>(16);
List<ValidationDemoBean> demoBeanList = new ArrayList<>(16);
/**
* case 0 测试属性非空,字符串属性设置为 ""
*/
ValidationDemoChildBean demoChildBean0 = new ValidationDemoChildBean();
demoChildBean0.setHeight(12);
demoChildBean0.setPhone("");
demoChildBeanList.add(demoChildBean0);
/**
* case 1 测试属性非空
*/
ValidationDemoChildBean demoChildBean1 = new ValidationDemoChildBean();
demoChildBean1.setHeight(1);
demoChildBeanList.add(demoChildBean1);
/**
* case 2 测试数字
*/
ValidationDemoChildBean demoChildBean2 = new ValidationDemoChildBean();
demoChildBean2.setHeight(500);
demoChildBean2.setPhone("13112345678");
demoChildBeanList.add(demoChildBean2);
/**
* case 3 测试正则
*/
ValidationDemoChildBean demoChildBean3 = new ValidationDemoChildBean();
demoChildBean3.setHeight(130);
demoChildBean3.setPhone("123456789");
demoChildBeanList.add(demoChildBean3);
/***
* case 4 测试全部符合要求
*/
ValidationDemoChildBean demoChildBean4 = new ValidationDemoChildBean();
demoChildBean4.setHeight(140);
demoChildBean4.setPhone("13112345678");
demoChildBeanList.add(demoChildBean4);
/**
* case 5 测试邮箱
*/
ValidationDemoBean demoBean5 = new ValidationDemoBean();
demoBean5.setUserName("tomcat5");
demoBean5.setAge(5);
demoBean5.setEmail("demo.demo");
demoBean5.setChildBean(demoChildBean4);
demoBeanList.add(demoBean5);
/**
* case 6 测试对象属性非空
*/
ValidationDemoBean demoBean6 = new ValidationDemoBean();
demoBean6.setUserName("tomcat6");
demoBean6.setAge(6);
demoBean6.setEmail("[email protected]");
demoBeanList.add(demoBean6);
/**
* case 7 测试对象属性中的属性
*/
ValidationDemoBean demoBean7 = new ValidationDemoBean();
demoBean7.setUserName("tomcat7");
demoBean7.setAge(7);
demoBean7.setEmail("[email protected]");
ValidationDemoChildBean demoChildBean7 = new ValidationDemoChildBean();
demoChildBean7.setHeight(170);
demoBean7.setChildBean(demoChildBean7);
demoBeanList.add(demoBean7);
for (int i = 0; i < demoChildBeanList.size(); i++) {
String validResult = BeanValidateUtil.validate(demoChildBeanList.get(i));
logger.debug("case {} : {}", i, validResult);
}
for (int j = 0; j < demoBeanList.size(); j++) {
String validResult = BeanValidateUtil.validate(demoBeanList.get(j));
logger.debug("case {} : {}", (j + 5), validResult);
}
}
}
2018-12-16 19:10:03:043 [main] DEBUG com.ljq.demo.util.BeanValidateUtilTest(BeanValidateUtilTest.java 88) -case 0 : [phone]手机号不符合要求
2018-12-16 19:10:03:072 [main] DEBUG com.ljq.demo.util.BeanValidateUtilTest(BeanValidateUtilTest.java 88) -case 1 : [phone]手机号不能为空
2018-12-16 19:10:03:092 [main] DEBUG com.ljq.demo.util.BeanValidateUtilTest(BeanValidateUtilTest.java 88) -case 2 : [height]最大值不超过 300
2018-12-16 19:10:03:110 [main] DEBUG com.ljq.demo.util.BeanValidateUtilTest(BeanValidateUtilTest.java 88) -case 3 : [phone]手机号不符合要求
2018-12-16 19:10:03:125 [main] DEBUG com.ljq.demo.util.BeanValidateUtilTest(BeanValidateUtilTest.java 88) -case 4 : null
2018-12-16 19:10:03:163 [main] DEBUG com.ljq.demo.util.BeanValidateUtilTest(BeanValidateUtilTest.java 92) -case 5 : [email]邮箱格式不正确
2018-12-16 19:10:03:200 [main] DEBUG com.ljq.demo.util.BeanValidateUtilTest(BeanValidateUtilTest.java 92) -case 6 : [childBean]childBean 不能为空
2018-12-16 19:10:03:221 [main] DEBUG com.ljq.demo.util.BeanValidateUtilTest(BeanValidateUtilTest.java 92) -case 7 : [childBean.phone]手机号不能为空
—— update 2018-12-16