使用javax.validation.Validator对对象以及对象中的类对象进行校验。
这样如果被校验的类中存在类对象,会进行迭代校验。如果字段存在注解校验就会校验。
代码:
package cm.sanshu.common.util; import java.lang.reflect.Field; import java.lang.reflect.Method; import java.util.Map; import java.util.Set; import javax.validation.ConstraintViolation; import javax.validation.Validation; import javax.validation.Validator; import javax.validation.ValidatorFactory; import org.springframework.util.StringUtils; import cn.sanshu.common.exceptions.ApplicationException; public class ValidateUtil { private static ValidatorFactory factory = Validation.buildDefaultValidatorFactory(); public static <T> void validate(T t) { try { Class<? extends Object> clazz = t.getClass(); Field [] fs = clazz.getDeclaredFields(); if(fs.length > 0 ) { for(Field f : fs) { if(f.getGenericType().toString().indexOf("要校验的包路径")!=-1) { String getMethodName = ReflectUtil.getGetMethodName(f.getName().toString()); Method getMethod = clazz.getMethod(getMethodName,null); Object o = getMethod.invoke(t); if(o!=null) { validate(o); } } } } Validator validator = factory.getValidator(); Set<ConstraintViolation<T>> constraintViolations = validator.validate(t); for (ConstraintViolation<T> constraintViolation : constraintViolations) { throw new ValidateBusinessException(Constant.SUB_SYSTEM, ExceptionType.VCE10009 , constraintViolation.getMessage()); } Method [] ms = clazz.getDeclaredMethods(); for(Method m : ms) { if(m.getName().equals("validate")) { m.invoke(t); } } } catch (Exception e) { throw new ApplicationException(e); } } }
请将:
要校验的包路径
替换成您要校验的路径,比如 cn.sanshu.service