Capybara-Validator 一個(gè)校驗(yàn)庫(kù)

老規(guī)矩先上鏈接

https://github.com/Ubitar/Capybara-Validator

引言

日常開(kāi)發(fā)中,我們通常會(huì)把較多的參數(shù)包裝在一個(gè)類里,例如:要提交的表單Bean類。那么肯定少不了對(duì)該Bean類內(nèi)變量數(shù)據(jù)的正確性校驗(yàn),對(duì)于校驗(yàn)方法你可以選擇簡(jiǎn)單的if-else或者使用校驗(yàn)器。

創(chuàng)建庫(kù)的原由

比如 Hibernate Validator 的校驗(yàn)器,如果你寫過(guò)java后端肯定知道,該校驗(yàn)器使用的是注解的方式進(jìn)行校驗(yàn)規(guī)則標(biāo)注,同時(shí)也具有分組校驗(yàn)、指定校驗(yàn)順序的功能,其提供的校驗(yàn)功能還是很強(qiáng)大的。
放張圖,體會(huì)下

這個(gè)東西是后端專屬的,如果不移植而直接應(yīng)用到Android上會(huì)有些不盡人意的地方:

1、無(wú)法直接應(yīng)用到安卓國(guó)際化應(yīng)用的校驗(yàn)情況中去 其注解中的message(校驗(yàn)失敗返回消息)只能使用固定的,是編譯時(shí)寫入的字符內(nèi)容,無(wú)法使用R.string這樣的資源(這個(gè)已經(jīng)有人進(jìn)行安卓版本的移植了,可以去查找下)
2、分組校驗(yàn)不易維護(hù) Bean的分組校驗(yàn)是通過(guò)指定Groups類實(shí)現(xiàn)的,隨著變量和分組增多,閱讀的難度很可能會(huì)大大增加
3、自定義校驗(yàn)器僅能判斷目標(biāo)字段 在校驗(yàn)判斷時(shí)無(wú)法結(jié)合其他字段一起做出判斷。
4、沒(méi)有提供校驗(yàn)結(jié)果Tag標(biāo)識(shí) 校驗(yàn)結(jié)果標(biāo)識(shí)只有message信息,沒(méi)有額外的標(biāo)識(shí)

這一切的矛頭都指向了注解校驗(yàn)的運(yùn)行方式。

換種實(shí)現(xiàn)方式

使用非注解的方式來(lái)實(shí)現(xiàn)檢驗(yàn)過(guò)程。校驗(yàn)的順序、校驗(yàn)規(guī)則都按照所添加的校驗(yàn)規(guī)則rule來(lái)線性運(yùn)行。

comparator
      //添加一個(gè)或多個(gè)校驗(yàn)規(guī)則
      .addItem(new NotNullRule(rawBean1.getStr(), "str can't not be null","tag1"))
      .validate();//確認(rèn)校驗(yàn)規(guī)則

校驗(yàn)后獲取校驗(yàn)結(jié)果、校驗(yàn)標(biāo)識(shí)、校驗(yàn)的目標(biāo)字段。

IResult result = CValidator.valid(new RawValidation1(bean));//執(zhí)行校驗(yàn),獲取結(jié)果
boolean hasError=result.hasError();
IReason reason = result.getReasonAtFirst();
String message = reason.getMessage();
IFieldRule<Object> rule = (IFieldRule<Object>) reason.getRule();
String tag = rule.getTag();
Object field = rule.getField();

導(dǎo)入

implementation 'com.ubitar.capybara:validator:1.0.4'

開(kāi)始

1、創(chuàng)建目標(biāo)Bean類

public class RawBean1 {
    private String str;
    //some setter and getter
}

2、創(chuàng)建校驗(yàn)流程類

public class RawValidation1 extends BaseValidation<RawBean1> {
    public RawValidation1(RawBean1 rawBean1) {
        super(rawBean1);
    }

    @Override
    public IResult<RawBean1> onValid(IComparator<RawBean1> comparator) {
        RawBean1 rawBean1 = getRaw();
        //Context context=getContext();
        return comparator
                 //添加一個(gè)或多個(gè)校驗(yàn)規(guī)則
                .addItem(new NotNullRule(rawBean1.getStr(), "str can't not be null","tag1"))
                .validate();//確認(rèn)校驗(yàn)規(guī)則
    }
}

3、執(zhí)行校驗(yàn),獲取結(jié)果

IResult result = CValidator.valid(new RawValidation1(bean));
//獲取第一個(gè)校驗(yàn)錯(cuò)誤原因
IReason reason = result.getReasonAtFirst();
//獲取原因信息
String message = reason.getMessage();
//獲取目標(biāo)規(guī)則、標(biāo)識(shí)、目標(biāo)字段
IFieldRule<Object> rule = (IFieldRule<Object>) reason.getRule();
String tag = rule.getTag();
Object field = rule.getField();
//是否開(kāi)啟快速校驗(yàn)
CValidator.valid(Raw bean,Boolean quickMode)
//非快速校驗(yàn)時(shí)獲取所有錯(cuò)誤原因
List<IReason> reasons = result.getAllReason();

更多校驗(yàn)規(guī)則

EmailRule、EqualsRule、LengthRule、MaxLengthRule、MinLengthRule、MaxRule、MinRule、NotEmptyRule、NotNullRule、NotSpaceRule、UrlRule

自定義校驗(yàn)

添加一個(gè)校驗(yàn)手機(jī)號(hào)的檢驗(yàn)規(guī)則

public class PhoneRule extends BaseRule<String> {

    private String message;

    public PhoneRule(@Nullable String field, String message) {
        super(field);
        this.message = message;
    }

    /**
     * 校驗(yàn)的具體實(shí)現(xiàn)
     *
     * @return true :校驗(yàn)通過(guò)   false:校驗(yàn)不通過(guò)
     */
    @Override
    public boolean onMatchField(String field) {
        if (field == null||field.length()<=0) return false;
        return Pattern.matches( "^[1]\\d{10}$", field);
    }

    // 返回的錯(cuò)誤信息
    @Override
    public String getMessage() {
        return message;
    }

    @Override
    public String getTag() {
        return tag;
    }
}

使用

comparator.addItem(new PhoneRule(rawBean.getPhone(),"手機(jī)號(hào)格式不正確"))
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容