java JSR303 参数验证
JSR303是JAVA EE6中的子规范。
用于对Java Bean的字段值进行校验,确保输入进来的数据在语义上是正确的,使验证逻辑从业务代码中脱离出来。
JSR303是运行时数据验证框架,验证之后验证的错误信息会马上返回。
有两个版本JSR303(BeanValidation1.0)和JSR349(BeanValidation1.1)。
由于之前使用的框架是structs2,没有使用springMvc没办法直接用注解,所以写了一个通用验证工具类,有其他好的验证建议可以写评论一起交流,以下是具体用法:
1.BeanValidatorUtils(必要)
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;
import javax.validation.ConstraintViolation;
import javax.validation.ConstraintViolationException;
import javax.validation.Validation;
import javax.validation.Validator;
import org.hibernate.validator.HibernateValidator;
import org.hibernate.validator.messageinterpolation.ResourceBundleMessageInterpolator;
import org.hibernate.validator.resourceloading.AggregateResourceBundleLocator;
/**
* 通用验证处理方法 工具类,符合JSR303验证规范,内部采用Hibernate Validator实现
*/
public class BeanValidatorUtils {
/** 存放错误信息的properties数组 */
public static final List<String> VALIDATION_MESSAGES = Arrays.asList("validationMessage");
/** 错误消息分隔符 */
public static final String SEPARATOR = "<br>";
/**
* 使用hibernate的注解来进行验证 .failFast(true)遇到错误立即报错
*/
private static Validator validator = Validation.byProvider(HibernateValidator.class).configure()
.messageInterpolator(
new ResourceBundleMessageInterpolator(new AggregateResourceBundleLocator(VALIDATION_MESSAGES)))
.buildValidatorFactory().getValidator();
/**
* 调用JSR303的validate方法, 验证失败时返回错误信息列表
*
* @param bean
* 要验证的JavaBean
* @param groups
* 验证分组
* @return 错误信息列表
*/
public static <T> List<String> validateListResult(T bean, Class<?>... groups) {
List<String> errorMessages = new ArrayList<String>();
Set<ConstraintViolation<T>> constraintViolations = validator.validate(bean, groups);
// 抛出检验异常
if (constraintViolations.size() > 0) {
for (ConstraintViolation<T> violation : constraintViolations) {
errorMessages.add(violation.getMessage());
}
}
return errorMessages;
}
/**
* 调用JSR303的validate方法, 验证失败时返回错误信息Map
*
* @param bean
* 要验证的JavaBean
* @param groups
* 验证分组
* @return 错误信息列表
*/
public static <T> Map<String, String> validateMapResult(T bean, Class<?>... groups) {
Map<String, String> errorMessages = new HashMap<String, String>();
Set<ConstraintViolation<T>> constraintViolations = validator.validate(bean, groups);
// 抛出检验异常
if (constraintViolations.size() > 0) {
for (ConstraintViolation<T> violation : constraintViolations) {
errorMessages.put(violation.getPropertyPath().toString(), violation.getMessage());
}
}
return errorMessages;
}
/**
* 调用JSR303的validate方法, 验证失败时抛出ConstraintViolationException.
*
* @param bean
* 要验证的JavaBean
* @param groups
* 验证分组
*
*/
public static void validateWithException(Object bean, Class<?>... groups) throws ConstraintViolationException {
Set<? extends ConstraintViolation<?>> constraintViolations = validator.validate(bean, groups);
if (constraintViolations.size() > 0) {
// 错误信息以异常的 形式抛出可通过e.getConstraintViolations()方法获取具体验证信息
throw new ConstraintViolationException(constraintViolations);
}
}
/**
* 内部转换方法,将错误信息List转换成String
*
* @param errorList
* 将错误信息List
* @return 错误信息
*/
public static String validateListToString(List<String> errorList) {
StringBuffer strBuffer = new StringBuffer();
for (String error : errorList) {
strBuffer.append(error);
strBuffer.append(SEPARATOR);
}
return strBuffer.toString();
}
}
2.ValidatorGroup(一个JavaBean满足不同验证规则时使用,可选)
/**
* 通用验证分组,可根据需求增加接口即可
*/
public interface ValidatorGroup {
/**
* 保存验证分组
*/
public static interface Save {
}
/**
* 插入验证分组
*/
public static interface Insert {
}
/**
* 查询验证分组
*/
public static interface Query {
}
/**
* 删除验证分组
*/
public static interface Delete {
}
/**
* 更新验证分组
*/
public static interface Update {
}
}
3.classpath下 validationMessage.properties(通用的验证提示信息,可选)
validator.required=是必填字段
validator.length=需要控制在
validator.engnum=只能包含大小写英文以和下划线
4.pom.xml
<dependency>
<groupId>javax.validation</groupId>
<artifactId>validation-api</artifactId>
<version>2.0.1.Final</version>
</dependency>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-validator</artifactId>
<version>6.0.8.Final</version>
</dependency>
<dependency>
<groupId>javax.el</groupId>
<artifactId>javax.el-api</artifactId>
<version>3.0.0</version>
</dependency>
BeanValidatorUtils内方法介绍
内部转换方法,将错误信息List转换成String
String strList = BeanValidatorUtils.validateListToString(errorList);
调用通用验证方法取得验证后的错误信息列表,可传递多个验证分组(可选)
List<String> strList = BeanValidatorUtils.validateListResult(validatorBean,group...);
调用通用验证方法取得验证后的错误信息Map,可传递多个验证分组(可选)
Map<String, String> = BeanValidatorUtils.validateMapResult(validatorBean,group...);
调用通用验证方法,验证失败时抛出ConstraintViolationException,可传递多个验证分组(可选)
BeanValidatorUtils.validateWithException(validatorBean,group...);
使用方法
一,首先要按照JSR303验证规范,写好需要验证的JavaBean,例如
例子
//需要验证的JavaBean
ValidatorBean validatorBean = new ValidatorBean();
//调用通用验证方法取得验证后的错误信息列表
List<String> strList = BeanValidatorUtils.validateListResult(validatorBean);
//如果有错误则抛出异常
if(strList.size()>0){
//将错误信息列表转化成字符串
String error = BeanValidatorUtils.validateListToString(strList);
System.out.println(error);
}