#简介
- 文档: http://beanvalidation.org/1.1/spec/
- API : http://docs.jboss.org/hibernate/beanvalidation/spec/1.1/api/
- http://blog.sina.com.cn/s/blog_a3d2fd2d0101hyu7.html
- http://haohaoxuexi.iteye.com/blog/1812584
JSR303是JAVA EE6中的子规范。用于对Java Bean的字段值进行校验,确保输入进来的数据在语义上是正确的,使验证逻辑从业务代码中脱离出来。JSR303是运行时数据验证框架,验证之后验证的错误信息会马上返回。有两个版本JSR303(BeanValidation1.0)和JSR349(BeanValidation1.1)。
javax.validation:validation-api:jar:1.1.0.Final
实现版本:
org.hibernate:hibernate-validator
org.apache.bval:bval-jsr303
jersery
注解
@NotNull | 引用类型 | 注解元素必须非空
@Null | 引用类型 |元素为空
@Digits | byte,short,int,long及其包装器,BigDecimal,BigInteger,String| 验证数字是否合法。属性:integer(整数部分), fraction(小数部分)
@Future/@Past| java.util.Date, java.util.Calendar | 是否在当前时间之后或之前
@Max/@Min | byte,short,int,long及其包装器,BigDecimal,BigInteger | 验证值是否小于等于最大指定整数值或大于等于最小指定整数值
@Pattern | String |验证字符串是否匹配指定的正则表达式。属性:regexp(正则), flags(选项,Pattern.Flag值)
@Size | String, Collection, Map, 数组 | 验证元素大小是否在指定范围内。属性:max(最大长度), min(最小长度), message(提示,默认为{constraint.size})
@DecimalMax/@DecimalMin | byte,short,int,long及其包装器,BigDecimal,BigInteger,String | 验证值是否小于等于最大指定小数值或大于等于最小指定小数值
@Valid | |验证值是否需要递归调用
@Null
@NotNull
@AssertFalse
@AssertTrue
@DecimalMax(value) 不大于value的数值
@DecimalMin(value) 不小于value的数值
@Digits(integer,fraction) 整数部分不超过integer,小数部分不超过fraction
@Future 将来的日期
@Past 过去的日期
@Max(value) 不大于value的数值
@Min(value) 不小于value的数值
@Pattern(value) 满足指定正则表达式
@Size(max,min) 长度在min到max之间
实现
引入pom文件
<dependency>
<groupId>javax.el</groupId>
<artifactId>javax.el-api</artifactId>
<version>2.2.4</version>
</dependency>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-validator</artifactId>
<version>5.1.3.Final</version>
</dependency>
基础util封装
import java.util.HashMap;
import java.util.Map;
import java.util.Set;
import javax.validation.ConstraintViolation;
import javax.validation.Validation;
import javax.validation.Validator;
import javax.validation.constraints.NotNull;
import javax.validation.groups.Default;
import org.hibernate.validator.constraints.NotEmpty;
/**
* 参数校验
*/
public class ValidatorUtil {
private static Validator validator = Validation.buildDefaultValidatorFactory().getValidator();
public static <T> Map<String, StringBuffer> validate(T obj) {
Map<String, StringBuffer> errorMap = null;
Set<ConstraintViolation<T>> set = validator.validate(obj, Default.class);
if (set != null && set.size() > 0) {
errorMap = new HashMap<String, StringBuffer>();
String property = null;
for (ConstraintViolation<T> cv : set) {
// 这里循环获取错误信息,可以自定义格式
property = cv.getPropertyPath().toString();
if (errorMap.get(property) != null) {
errorMap.get(property).append("," + cv.getMessage());
} else {
StringBuffer sb = new StringBuffer();
sb.append(cv.getMessage());
errorMap.put(property, sb);
}
}
}
return errorMap;
}
}
测试
public class MyBean {
@NotNull
private Long userId;
@NotEmpty
private String email;
public Long getUserId() {
return userId;
}
public void setUserId(Long userId) {
this.userId = userId;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
}
public static void main(String[] args) {
MyBean bean = new MyBean();
Map<String, StringBuffer> map = ValidatorUtil.validate(bean);
System.out.println(map);
}