(1). 概述

在这里主要对FluentValidator进行剖析.

(2). 看下FluentValidator类图

"FluentValidator类图"

(3). FluentValidator使用

FluentValidator 
	// *****************************************************
	// 4. 创建FluentValidator对象
	// *****************************************************
	.checkAll()
	// *****************************************************
	// 5. FluentValidator进行验证时,验证不通过直接退出,不再继续对其它对象进行验证了
	// *****************************************************
	// 验证规则不通过时,立即返回,不再进行后续的验证了
	.failFast()
	// *****************************************************
	// 6. 配置验证对象与验证规则的关系
	// *****************************************************
	.on(car.getSeatCount(), new CarSeatCountValidator()) //
	// *****************************************************
	// 7. 开始验证,并回调
	// *****************************************************
	.doValidate(callback);

(4). FluentValidator.checkAll

public static FluentValidator checkAll() {
	return checkAll(null);
} 

public static FluentValidator checkAll(Class... groups) {
	// 创建了一个:FluentValidator对象
	return new FluentValidator().setGroups(groups);
}

(5). FluentValidator.failFast

public FluentValidator failFast() {
	this.isFailFast = true;
	return this;
}

(6). FluentValidator.on

public <T> FluentValidator on(T t, Validator<T> v) {
	Preconditions.checkNotNull(v, "Validator should not be NULL");
	// 1. 如果Validator属于:ValidatorHandler,则调用:ValidatorHandler.compose
	composeIfPossible(v, t);
	// 2. 创建:ValidatorElement Hold住:验证规则(Validator)和验证对象(属性)
	// 3. 添加到:validatorElementList里
	doAdd(new ValidatorElement(t, v));
	lastAddCount = 1;
	return this;
} // end on


private <T>  void composeIfPossible(Validator<T> v, T t) {
	final FluentValidator self = this;
	if (v instanceof ValidatorHandler) {
		((ValidatorHandler) v).compose(self, context, t);
	}
} // end composeIfPossible

(7). FluentValidator.doValidate

public FluentValidator doValidate(ValidateCallback cb) {
	Preconditions.checkNotNull(cb, "ValidateCallback should not be NULL");
	// 1. 如果待验证的列表为空,则直接返回
	if (validatorElementList.isEmpty()) {
		LOGGER.debug("Nothing to validate");
		return this;
	}
	
	// 2. 给上下文设置一个默认的:result
	context.setResult(result);

	// 打印日志
	LOGGER.debug("Start to validate through " + validatorElementList);
	long start = System.currentTimeMillis();
	try {
		// ThreadLocal设置groups
		GroupingHolder.setGrouping(groups);
		// ************************************************************
		// 3. 遍历所有的验证规则集合
		// ************************************************************
		for (ValidatorElement element : validatorElementList.getAllValidatorElements()) {
			// 4. 要验证的对象
			Object target = element.getTarget();
			// 5. 验证的规则
			Validator v = element.getValidator();
			try {
				// *******************************************************
				// 6. 先调用:Validator.accept,只有为:true时,才调用:validate
				// *******************************************************
				if (v.accept(context, target)) {
					// *******************************************************
					// 7. 再调用:Validator.validate
					// *******************************************************
					if (!v.validate(context, target)) { //验证不通过时
						result.setIsSuccess(false); // 设置验证不通过
						
						if (isFailFast) { // 如果:isFailFast为true,跳出循环体,不再进行余下的验证了
							break;
						}// end if
					} // end validate
				} // end accept
			} catch (Exception e) {
				try {
					// *****************************************************
					// 8. 有异常时,调用:Validator.onException
					// *****************************************************
					v.onException(e, context, target);
					// 9. 回调:ValidateCallback
					cb.onUncaughtException(v, e, target);
				} catch (Exception e1) {
					if (LOGGER.isDebugEnabled()) {
						LOGGER.error(v + " onException or onUncaughtException throws exception due to " + e1
								.getMessage(), e1);
					}
					throw new RuntimeValidateException(e1);
				}
				if (LOGGER.isDebugEnabled()) {
					LOGGER.error(v + " failed due to " + e.getMessage(), e);
				}
				throw new RuntimeValidateException(e);
			}
		}

		if (result.isSuccess()) {  // 验证成功,回调:ValidateCallback.onSuccess
			cb.onSuccess(validatorElementList);
		} else { // 验证失败,回调:ValidateCallback.onFail
			cb.onFail(validatorElementList, result.getErrors());
		}
	} finally {
		// 清除ThreadLocal信息
		GroupingHolder.clean();
		// 计算验证的成本
		int timeElapsed = (int) (System.currentTimeMillis() - start);
		LOGGER.debug("End to validate through" + validatorElementList + " costing " + timeElapsed + "ms with "
				+ "isSuccess=" + result.isSuccess());
		result.setTimeElapsed(timeElapsed);
	}
	return this;
}

(8). 总结

好像没什么要总结的,FluentValidator源码相当的简单!