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

相关文章
相关标签/搜索