android上的java bean 校驗-Hibernate Validator移植

Hibernate Validator on Android

github.com/hss01248/An… html

適用場景

拿到後臺數據後,如何更高效地校驗數據有效性,而不是在代碼裏寫一堆if else判斷?java

Bean Validation 2.0(JSR 380)定義了用於實體和方法驗證的元數據模型和API,Hibernate Validator是目前最好的實現.如何移植到安卓上呢?android

參考:git

stackoverflow.com/questions/2…github

hibernate.org/validator/d…json

使用

初始化

BeanValidator.init(this);
複製代碼

使用

image-20200529144724999

提供了中英文的默認文案:

image-20200529144800253

image-20200529144823249

自定義配置文案:

image-20200529144851858

校驗:

String errorMsg = BeanValidator.validate(bean);
//返回的errorMsg爲空就說明校驗經過
if(!TextUtils.isEmpty(errorMsg)){
    Toast.makeText(this,errorMsg,Toast.LENGTH_LONG).show();
}else {
    //拿到合格的bean
}
複製代碼

retrofit使用

Retrofit retrofit = new Retrofit.Builder()
        .addConverterFactory(GsonConverterFactoryWithBeanValidator.create())
複製代碼

image-20200529145402034

返回的msg的格式:

能夠直接顯示給用戶api

image-20200529145018717

gradle使用:

implementation 'com.github.hss01248.AndroidBeanValidator:beanvalidator:1.0.1'
implementation 'com.github.hss01248.AndroidBeanValidator:gsonconvertervalidator:1.0.1'

複製代碼

注意

不能混淆相關的string資源.bash

若是使用微信的資源混淆工具andresgruard,能夠將驗證翻譯放到同一個xml文件中,而後添加忽略.微信

好比:網絡

andResGuard {
    use7zip = false
    useSign = true
    // it will keep the origin path of your resources when it's true keepRoot = false whiteList = [ "R.string.validator_msg", .... 複製代碼

方法耗時

100-300ms

主要耗時是框架內部反射.

image-20200529144936189

應該放到網絡框架json解析的下一步,不要放到主線程

hibernate的校驗模式

上面例子中一次性返回了全部驗證不經過的集合,一般按順序驗證到第一個字段不符合驗證要求時,就能夠直接拒絕請求了。Hibernate Validator有如下兩種驗證模式:

一、普通模式(默認是這個模式)

  普通模式(會校驗完全部的屬性,而後返回全部的驗證失敗信息)

二、快速失敗返回模式

  快速失敗返回模式(只要有一個驗證失敗,則返回)

兩種驗證模式配置方式:(參考官方文檔

failFast:true 快速失敗返回模式 false 普通模式

.addProperty( "hibernate.validator.fail_fast", isDebugMode() ? "false": "true"  )
複製代碼

image-20200529145108074

兼容性

首先配置

.ignoreXmlConfiguration()
複製代碼

在低版本(api16,19)上報找不到Log_$logger;

IllegalArgumentException: Invalid logger interface org.hibernate.validator.internal.util.logging.Log (implementation not found)
複製代碼

解決方法: 將Log_$logger拷出來,包路徑不變,類名改爲常規名字便可:

image-20200529145128566

注意要編譯成功,還須要依賴:

implementation group: 'javax.xml', name: 'jaxb-api', version: '2.1'
implementation group: 'javax.annotation', name: 'javax.annotation-api', version: '1.3.1'
複製代碼

至此,可兼容到api16

相關文章
相關標籤/搜索