Java数据校验(Bean Validation / JSR303)

原创
2017/02/07 13:56
阅读数 2.7K

#简介

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);
}
展开阅读全文
打赏
0
2 收藏
分享
加载中
更多评论
打赏
0 评论
2 收藏
0
分享
返回顶部
顶部