(1). 概述
前面做了一个小小的案例,我们需要自定义验证规则类,这个类需要实现:Validator接口.在这里,主要剖析:Validator.
(2). Validator类结构图
(3). Validator
package com.baidu.unbiz.fluentvalidator;
/**
* 验证器接口。
* <p/>
* 泛型<t>T</t>表示待验证对象的类型
*
* @author zhangxu
*/
public interface Validator<T> {
/**
* 判断在该对象上是否接受或者需要验证
* <p/>
* 如果返回true,那么则调用{@link #validate(ValidatorContext, Object)},否则跳过该验证器
*
* @param context 验证上下文
* @param t 待验证对象
*
* @return 是否接受验证
*/
boolean accept(ValidatorContext context, T t);
/**
* 执行验证
* <p/>
* 如果发生错误内部需要调用{@link ValidatorContext#addErrorMsg(String)}方法,也即<code>context.addErrorMsg(String)
* </code>来添加错误,该错误会被添加到结果存根{@link Result}的错误消息列表中。
*
* @param context 验证上下文
* @param t 待验证对象
*
* @return 是否验证通过
*/
boolean validate(ValidatorContext context, T t);
/**
* 异常回调
* <p/>
* 当执行{@link #accept(ValidatorContext, Object)}或者{@link #validate(ValidatorContext, Object)}发生异常时的如何处理
*
* @param e 异常
* @param context 验证上下文
* @param t 待验证对象
*/
void onException(Exception e, ValidatorContext context, T t);
}
(4). Composable
package com.baidu.unbiz.fluentvalidator;
/**
* 在Validator中添加额外的验证逻辑,用组合的方式
*
* @author zhangxu
*/
public interface Composable<T> {
/**
* 切入点,可以织入一些校验逻辑
*
* @param current 当前的FluentValidator实例
* @param context 验证器执行调用中的上下文
* @param t 待验证的对象
*/
void compose(FluentValidator current, ValidatorContext context, T t);
}
(5). ValidatorHandler
package com.baidu.unbiz.fluentvalidator;
import com.baidu.unbiz.fluentvalidator.annotation.ThreadSafe;
/**
* 验证器默认实现
* <p/>
* 自定义的验证器如果不想实现{@link Validator}所有方法,可以使用这个默认实现,仅覆盖自己需要实现的方法
*
* @author zhangxu
* @see Validator
*/
@ThreadSafe
public class ValidatorHandler<T> implements Validator<T>, Composable<T> {
@Override
public boolean accept(ValidatorContext context, T t) {
return true;
}
@Override
public boolean validate(ValidatorContext context, T t) {
return true;
}
@Override
public void onException(Exception e, ValidatorContext context, T t) {
}
@Override
public void compose(FluentValidator current, ValidatorContext context, T t) {
// extension point for clients to add more validators to the current fluent chain
}
/**
* 验证器的名字,用简单类名称表示
*
* @return 名字
*/
@Override
public String toString() {
return this.getClass().getSimpleName();
}
}
(6). 总结
Validator是开发人员应该要实现的验证规则接口.这也就理解了为什么要实现:Validator还要继承:ValidatorHandler. 继承ValidatorHandler是为了让开发根据需要,重写相应的实现方法即可.