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...);

使用方法

java JSR303 参数验证
一,首先要按照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);
}