package cn.org.rapid_framework.util.holder; import java.util.Set; import javax.validation.ConstraintViolation; import javax.validation.ConstraintViolationException; import javax.validation.Validator; import javax.validation.metadata.BeanDescriptor; import org.springframework.beans.factory.InitializingBean; /** * 用于持有JSR303 Validator(Hibernate Validator),使调用Validator可以当静态方法使用. * * <pre> * static 方法调用: * BeanValidatorHolder.validate(object); * </pre> * <pre> * spring配置: * <bean class="cn.org.rapid_framework.util.holder.BeanValidatorHolder"> * <property name="validator" ref="validator"/> * </bean> * </pre> * @author badqiu * */ public class BeanValidatorHolder implements InitializingBean{ private static Validator validator; public void afterPropertiesSet() throws Exception { if(validator == null) throw new IllegalStateException("not found JSR303(HibernateValidator) 'validator' for BeanValidatorHolder "); } public void setValidator(Validator v) { if(validator != null) { throw new IllegalStateException("BeanValidatorHolder already holded 'validator'"); } validator = v; } private static Validator getRequiredValidator() { if(validator == null) throw new IllegalStateException("'validator' property is null,BeanValidatorHolder not yet init."); return validator; } public static final <T> Set<ConstraintViolation<T>> validate(T object, Class<?>... groups) { return getRequiredValidator().validate(object, groups); } /** * 验证失败将抛出异常 */ public static final <T> void validateWithException(T object, Class<?>... groups) throws ConstraintViolationException { Set constraintViolations = getRequiredValidator().validate(object,groups); String msg = "validate failure on object:"+object.getClass().getSimpleName(); if(!constraintViolations.isEmpty()) { throw new ConstraintViolationException(msg,constraintViolations); } } public static final <T> Set<ConstraintViolation<T>> validateProperty(T object, String propertyName, Class<?>... groups) { return getRequiredValidator().validateProperty(object, propertyName,groups); } /** * 验证失败将抛出异常 */ public static final <T> void validatePropertyWithException(T object, String propertyName, Class<?>... groups) throws ConstraintViolationException { Set constraintViolations = getRequiredValidator().validateProperty(object, propertyName); String msg = "validate property failure on object:"+object.getClass().getSimpleName()+"."+propertyName+""; if(!constraintViolations.isEmpty()) { throw new ConstraintViolationException(msg,constraintViolations); } } public static final <T> Set<ConstraintViolation<T>> validateValue(Class<T> beanType, String propertyName, Object value, Class<?>... groups) { return getRequiredValidator().validateValue(beanType, propertyName,value,groups); } /** * 验证失败将抛出异常 */ public static final <T> void validateValueWithException(Class<T> beanType, String propertyName, Object value, Class<?>... groups) throws ConstraintViolationException { Set constraintViolations = getRequiredValidator().validateValue(beanType, propertyName,value); String msg = "validate value failure on object:"+beanType.getSimpleName()+"."+propertyName+" value:"+value; if(!constraintViolations.isEmpty()) { throw new ConstraintViolationException(msg,constraintViolations); } } public static final BeanDescriptor getConstraintsForClass(Class<?> clazz) { return getRequiredValidator().getConstraintsForClass(clazz); } public static final <T> T unwrap(Class<T> type) { return getRequiredValidator().unwrap(type); } public static void cleanHolder() { validator = null; } }