拿到後臺數據後,如何更高效地校驗數據有效性,而不是在代碼裏寫一堆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);
複製代碼
String errorMsg = BeanValidator.validate(bean);
//返回的errorMsg爲空就說明校驗經過
if(!TextUtils.isEmpty(errorMsg)){
Toast.makeText(this,errorMsg,Toast.LENGTH_LONG).show();
}else {
//拿到合格的bean
}
複製代碼
Retrofit retrofit = new Retrofit.Builder()
.addConverterFactory(GsonConverterFactoryWithBeanValidator.create())
複製代碼
能夠直接顯示給用戶api
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
主要耗時是框架內部反射.
應該放到網絡框架json解析的下一步,不要放到主線程
上面例子中一次性返回了全部驗證不經過的集合,一般按順序驗證到第一個字段不符合驗證要求時,就能夠直接拒絕請求了。Hibernate Validator有如下兩種驗證模式:
普通模式(會校驗完全部的屬性,而後返回全部的驗證失敗信息)
快速失敗返回模式(只要有一個驗證失敗,則返回)
兩種驗證模式配置方式:(參考官方文檔)
failFast:true 快速失敗返回模式 false 普通模式
.addProperty( "hibernate.validator.fail_fast", isDebugMode() ? "false": "true" )
複製代碼
.ignoreXmlConfiguration()
複製代碼
IllegalArgumentException: Invalid logger interface org.hibernate.validator.internal.util.logging.Log (implementation not found)
複製代碼
解決方法: 將Log_$logger拷出來,包路徑不變,類名改爲常規名字便可:
注意要編譯成功,還須要依賴:
implementation group: 'javax.xml', name: 'jaxb-api', version: '2.1'
implementation group: 'javax.annotation', name: 'javax.annotation-api', version: '1.3.1'
複製代碼