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

水牛 2020/5/29 23:56:37

Hibernate Validator on Android github.com/hss01248/An…适用场景 拿到后台数据后,如何更高效地校验数据有效性,而不是在代码里写一堆if else判断? Bean Validation 2.0(JSR 380)定义了用于实体和方法验证的元数据模型和API,Hibernate Validator是目前最好的实现.如…

Hibernate Validator on Android

github.com/hss01248/An…

适用场景

拿到后台数据后,如何更高效地校验数据有效性,而不是在代码里写一堆if else判断?

Bean Validation 2.0(JSR 380)定义了用于实体和方法验证的元数据模型和API,Hibernate Validator是目前最好的实现.如何移植到安卓上呢?

参考:

stackoverflow.com/questions/2…

hibernate.org/validator/d…

使用

初始化

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的格式:

可以直接显示给用户

image-20200529145018717

gradle使用:

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

复制代码

注意

不能混淆相关的string资源.

如果使用微信的资源混淆工具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有以下两种验证模式:

1、普通模式(默认是这个模式)

  普通模式(会校验完所有的属性,然后返回所有的验证失败信息)

2、快速失败返回模式

  快速失败返回模式(只要有一个验证失败,则返回)

两种验证模式配置方式:(参考官方文档)

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

随时随地学软件编程-关注百度小程序和微信小程序
关于找一找教程网

本站文章仅代表作者观点,不代表本站立场,所有文章非营利性免费分享。
本站提供了软件编程、网站开发技术、服务器运维、人工智能等等IT技术文章,希望广大程序员努力学习,让我们用科技改变世界。
[android上的java bean 校验-Hibernate Validator移植]http://www.zyiz.net/tech/detail-137792.html

上一篇:为什么说80%的人都把ViewPager用错了?

下一篇:深入浅出 Flutter Framework 之 PaintingContext

赞(0)

共有 条评论 网友评论

验证码: 看不清楚?
    关注微信小程序
    程序员编程王-随时随地学编程

    扫描二维码或查找【程序员编程王】

    可以随时随地学编程啦!

    技术文章导航 更多>
    扫一扫关注最新编程教程