拿到后台数据后,如何更高效地校验数据有效性,而不是在代码里写一堆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'
复制代码