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

老規(guī)矩先上鏈接

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

引言

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

創(chuàng)建庫的原由

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

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

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

使用非注解的方式來實(shí)現(xiàn)檢驗(yàn)過程。校驗(yàn)的順序鞭铆、校驗(yàn)規(guī)則都按照所添加的校驗(yàn)規(guī)則rule來線性運(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'

開始

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();
//是否開啟快速校驗(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)通過   false:校驗(yàn)不通過
     */
    @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)系作者
  • 序言:七十年代末羔杨,一起剝皮案震驚了整個(gè)濱河市捌臊,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌兜材,老刑警劉巖理澎,帶你破解...
    沈念sama閱讀 211,376評(píng)論 6 491
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異曙寡,居然都是意外死亡糠爬,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,126評(píng)論 2 385
  • 文/潘曉璐 我一進(jìn)店門举庶,熙熙樓的掌柜王于貴愁眉苦臉地迎上來执隧,“玉大人,你說我怎么就攤上這事户侥《屏穑” “怎么了?”我有些...
    開封第一講書人閱讀 156,966評(píng)論 0 347
  • 文/不壞的土叔 我叫張陵蕊唐,是天一觀的道長屋摔。 經(jīng)常有香客問我,道長替梨,這世上最難降的妖魔是什么钓试? 我笑而不...
    開封第一講書人閱讀 56,432評(píng)論 1 283
  • 正文 為了忘掉前任装黑,我火速辦了婚禮,結(jié)果婚禮上弓熏,老公的妹妹穿的比我還像新娘恋谭。我一直安慰自己,他們只是感情好硝烂,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,519評(píng)論 6 385
  • 文/花漫 我一把揭開白布箕别。 她就那樣靜靜地躺著,像睡著了一般滞谢。 火紅的嫁衣襯著肌膚如雪串稀。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,792評(píng)論 1 290
  • 那天狮杨,我揣著相機(jī)與錄音母截,去河邊找鬼。 笑死橄教,一個(gè)胖子當(dāng)著我的面吹牛清寇,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播护蝶,決...
    沈念sama閱讀 38,933評(píng)論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼华烟,長吁一口氣:“原來是場噩夢(mèng)啊……” “哼!你這毒婦竟也來了持灰?” 一聲冷哼從身側(cè)響起盔夜,我...
    開封第一講書人閱讀 37,701評(píng)論 0 266
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎堤魁,沒想到半個(gè)月后喂链,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,143評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡妥泉,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,488評(píng)論 2 327
  • 正文 我和宋清朗相戀三年椭微,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片盲链。...
    茶點(diǎn)故事閱讀 38,626評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡蝇率,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出刽沾,到底是詐尸還是另有隱情本慕,我是刑警寧澤,帶...
    沈念sama閱讀 34,292評(píng)論 4 329
  • 正文 年R本政府宣布悠轩,位于F島的核電站,受9級(jí)特大地震影響攻泼,放射性物質(zhì)發(fā)生泄漏火架。R本人自食惡果不足惜鉴象,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,896評(píng)論 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望何鸡。 院中可真熱鬧纺弊,春花似錦、人聲如沸骡男。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,742評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽隔盛。三九已至犹菱,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間吮炕,已是汗流浹背腊脱。 一陣腳步聲響...
    開封第一講書人閱讀 31,977評(píng)論 1 265
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留龙亲,地道東北人陕凹。 一個(gè)月前我還...
    沈念sama閱讀 46,324評(píng)論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像鳄炉,于是被迫代替她去往敵國和親杜耙。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,494評(píng)論 2 348