private static final <T> ConstraintViolation<T> validateField( T bean, Field field, Object fieldValue, Annotation constraintAnno) { boolean isValid = true; // 获取该注解验证规则上的所有验证器,并依次进行调用验证 ConstraintValidator[] validators = ValidationContextCache.getConstraintValidators(constraintAnno); if (validators == null || validators.length == 0) { return null; } for (ConstraintValidator validator : validators) { if (validator == null) { continue; } isValid &= validator.isValid(bean, fieldValue, constraintAnno, field); if (!isValid) { return new ConstraintViolation<T>( bean, field.getName(), fieldValue, getMessage(constraintAnno)); } } return null; }
/** * 验证JavaBean * * @param bean 需要验证的JavaBean对象 * @param fields 需要可能指定验证的Bean字段 * @return 验证结果 */ @SuppressWarnings("unchecked") public static final <T> ConstraintViolation<T>[] validate(T bean, String... fields) { if (bean == null) { throw new ValidationException("Validated JavaBean object can not be null!"); } if (bean.getClass() == Object.class) { return new ConstraintViolation[0]; } FieldContext[] fieldContexts = ValidationContextCache.getConstraintFieldContexts(bean.getClass()); if (fieldContexts == null || fieldContexts.length == 0) { return new ConstraintViolation[0]; } // 对指定的field进行提取 FieldContext[] needFieldContexts = null; if (fields != null && fields.length > 0) { needFieldContexts = new FieldContext[fields.length]; int i = 0; boolean fExist = false; // 检测指定的field是否存在于给定的Bean中 for (String f : fields) { if (f == null || f.trim().length() == 0) { continue; } fExist = false; for (FieldContext fc : fieldContexts) { if (fc.getField().getName().equals(f)) { needFieldContexts[i++] = fc; fExist = true; break; } } if (!fExist) { throw new ValidationException( "The field `" + f + "` is not exists in constraint fields of `" + bean.getClass().getName() + "`!"); } } // 指定的field都为null或空,则指定无效,验证全部 if (i == 0) { needFieldContexts = fieldContexts; } } else { needFieldContexts = fieldContexts; } List<ConstraintViolation<T>> violations = new ArrayList<ConstraintViolation<T>>(needFieldContexts.length); ConstraintViolation<T> fcv = null; for (FieldContext fc : needFieldContexts) { fcv = validateFieldContext(bean, fc); if (fcv != null) { violations.add(fcv); } } return violations.toArray(new ConstraintViolation[violations.size()]); }