游戏电视苹果数码历史美丽
投稿投诉
美丽时装
彩妆资讯
历史明星
乐活安卓
数码常识
驾车健康
苹果问答
网络发型
电视车载
室内电影
游戏科学
音乐整形

5年,只为了一个更好的校验框架

  天地初开
  五年前,科技大厦1层B座。
  小明的眼睛直勾勾地盯着屏幕,双手噼里啪啦的敲着键盘。
  思考是不存在的,思考只会让小明的速度降下来。
  优秀的程序员完全不需要思考,就像不需要写文档和注释一样。
  真是简单的需求啊,小明觉得有些无聊,毫无挑战。
  和无数个web开发者一样,小明今天做的是用户的注册功能。
  首先定义一下对应的用户注册对象:publicclassUserRegister{名称privateStringname;原始密码privateStringpassword;确认密码privateStringpassword2;性别privateStringsex;gettersettertoString()}
  注册时格式要求文档也做了简单的限制:
  (1)name名称必须介于132位之间
  (2)password密码必须介于632位之间
  (3)password2确认密码必须和password保持一致
  (4)sex性别必须为BOYGIRL两者中的一个。
  这也不难,无情的编码机器开始疯狂的敲打着键盘,不一会儿基本的校验方法就写好了:privatevoidparamCheck(UserRegisteruserRegister){1。名称StringnameuserRegister。getName();if(namenull){thrownewIllegalArgumentException(名称不可为空);}if(name。length()1name。length()32){thrownewIllegalArgumentException(名称长度必须介于132之间);}2。密码StringpassworduserRegister。getPassword();if(passwordnull){thrownewIllegalArgumentException(密码不可为空);}if(password。length()6password。length()32){thrownewIllegalArgumentException(密码长度必须介于632之间);}2。2确认密码Stringpassword2userRegister。getPassword2();if(!password。equals(password2)){thrownewIllegalArgumentException(确认密码必须和密码保持一致);}3。性别StringsexuserRegister。getSex();if(!SexEnum。BOY。getCode()。equals(sex)!SexEnum。GIRL。getCode()。equals(sex)){thrownewIllegalArgumentException(性别必须指定为GIRLBOY);}}
  打完收工,小明把代码提交完毕,就早早地下班跑路了。初见HibernateValidator
  小明啊,我今天简单地看了一下你的代码。,项目经理看似随意地提了一句。
  小明停下了手中的工作,看向项目经理,意思是让他继续说下去。
  整体还是比较严谨的,就是写了太多的校验代码。
  太多的校验代码?不校验数据用户乱填怎么办?,小明有些不太明白。
  校验代码的话,有时间可以了解一下hibernatevalidator校验框架。
  可以,我有时间看下。
  嘴上说着,小明心里一万个不愿意。
  什么休眠框架,影响我搬砖的速度。
  后来小明还是勉为其难的搜索了一下hibernatevalidator,看了看感觉还不错。
  这个框架提供了很多内置的注解,便于日常校验的开发,大大提升了校验方法的可复用性。
  于是,小明把自己的校验方法改良了一下:publicclassUserRegister{名称NotNull(message名称不可为空)Length(min1,max32,message名称长度必须介于132之间)privateStringname;原始密码NotNull(message密码不可为空不可为空)Length(min1,max32,message密码长度必须介于632之间)privateStringpassword;确认密码NotNull(message确认密码不可为空不可为空)Length(min1,max32,message确认密码必须介于632之间)privateStringpassword2;性别privateStringsex;}
  校验方法调整如下:privatevoidparamCheck2(UserRegisteruserRegister){1。名称ValidateUtil。validate(userRegister);2。2确认密码Stringpassword2userRegister。getPassword2();if(!userRegister。getPassword()。equals(password2)){thrownewIllegalArgumentException(确认密码必须和密码保持一致);}3。性别StringsexuserRegister。getSex();if(!SexEnum。BOY。getCode()。equals(sex)!SexEnum。GIRL。getCode()。equals(sex)){thrownewIllegalArgumentException(性别必须指定为GIRLBOY);}}
  确实清爽了很多,ValidateUtil是基于一个简单的工具类:publicclassValidateUtil{使用hibernate的注解来进行验证privatestaticValidatorvalidatorValidation。byProvider(HibernateValidator。class)。configure()。failFast(true)。buildValidatorFactory()。getValidator();publicstaticTvoidvalidate(Tt){SetConstraintViolationTconstraintViolationsvalidator。validate(t);抛出检验异常if(constraintViolations。size()0){finalStringmsgconstraintViolations。iterator()。next()。getMessage();thrownewIllegalArgumentException(msg);}}}
  但是小明依然觉得不满意,sex的校验可以进一步优化吗?
  答案是肯定的,小明发现hibernatevalidator支持自定义注解。
  这是一个很强大的功能,优秀的框架就应该为使用者提供更多的可能性。
  于是小明实现了一个自定义注解:Target({ElementType。METHOD,ElementType。FIELD,ElementType。ANNOTATIONTYPE})Retention(RetentionPolicy。RUNTIME)Constraint(validatedByMyEnumRangesValidator。class)publicinterfaceMyEnumRanges{Classlt;?extendsEnumvalue();Stringmessage()default;}
  MyEnumRangesValidator的实现如下:publicclassMyEnumRangesValidatorimplementsConstraintValidatorMyEnumRanges,String{privateMyEnumRangesmyEnumRanges;Overridepublicvoidinitialize(MyEnumRangesconstraintAnnotation){this。myEnumRangesconstraintAnnotation;}OverridepublicbooleanisValid(Stringvalue,ConstraintValidatorContextcontext){returngetEnumValues(myEnumRanges。value())。contains(value);}获取枚举值对应的信息paramenumClass枚举类return枚举说明since0。0。9privateListStringgetEnumValues(Classlt;?extendsEnumenumClass){Enum〔〕enumsenumClass。getEnumConstants();returnArrayUtil。toList(enums,newIHandlerEnum,String(){OverridepublicStringhandle(EnumanEnum){returnanEnum。toString();}});}}
  限制当前的字段值必须在指定的枚举范围内,以后所有涉及到枚举范围的,使用这个注解即可搞定。
  然后把MyEnumRanges加在sex字段上:NotNull(message性别不可为空)MyEnumRanges(message性别必须在BOYGIRL范围内,valueSexEnum。class)privateStringsex;
  这样校验方法可以简化如下:privatevoidparamCheck3(UserRegisteruserRegister){1。名称ValidateUtil。validate(userRegister);2。2确认密码Stringpassword2userRegister。getPassword2();if(!userRegister。getPassword()。equals(password2)){thrownewIllegalArgumentException(确认密码必须和密码保持一致);}}
  小明满意的笑了笑。
  但是他的笑容只是持续了一会儿,因为他发现了一个不令人满意的地方。
  确认密码这一段代码可以去掉吗?
  好像直接使用hibernatevalidator框架是做不到的。框架不足之处
  这一切令小明很痛苦,他发现框架本身确实有很多不足之处。hibernatevalidator无法满足的场景
  如今java最流行的hibernatevalidator框架,但是有些场景是无法满足的。
  比如:验证新密码和确认密码是否相同。(同一对象下的不同属性之间关系)当一个属性值满足某个条件时,才进行其他值的参数校验。多个属性值,至少有一个不能为null
  其实,在对于多个字段的关联关系处理时,hibernatevalidator就会比较弱。
  本项目结合原有的优点,进行这一点的功能强化。validationapi过于复杂
  validationapi提供了丰富的特性定义,也同时带来了一个问题。
  实现起来,特别复杂。
  然而我们实际使用中,常常不需要这么复杂的实现。
  validapi提供了一套简化很多的api,便于用户自行实现。自定义缺乏灵活性
  hibernatevalidator在使用中,自定义约束实现是基于注解的,针对单个属性校验不够灵活。
  本项目中,将属性校验约束和注解约束区分开,便于复用和拓展。过程式编程vs注解式编程
  hibernatevalidator核心支持的是注解式编程,基于bean的校验。
  一个问题是针对属性校验不灵活,有时候针对bean的校验,还是要自己写判断。
  本项目支持fluentapi进行过程式编程,同时支持注解式编程。
  尽可能兼顾灵活性与便利性。valid工具的诞生
  于是小明花了很长时间,写了一个校验工具,希望可以弥补上述工具的不足。
  开源地址:https:github。comhoubbvalid特性支持fluentvalidation支持jsr303注解,支持所有hibenratevalidator常用注解支持i18n支持用户自定义策略支持用户自定义注解支持针对属性的校验支持过程式编程与注解式编程支持指定校验生效的条件快速开始maven引入dependencygroupIdcom。github。houbbgroupIdvalidjsrartifactIdversion0。2。2versiondependency编码
  工具类使用:UserusernewUser();user。sex(what)。password(old)。password2(new);ValidHelper。failOverThrow(user);
  报错如下:
  会抛出ValidRuntimeException异常,异常的信息如下:name:值null不是预期值,password:值old不是预期值,sex:值what不是预期值
  其中User的定义如下:publicclassUser{名称HasNotNull({nickName})privateStringname;昵称privateStringnickName;原始密码AllEquals(password2)privateStringpassword;新密码privateStringpassword2;性别Ranges({boy,girl})privateStringsex;失败类型枚举EnumRanges(FailTypeEnum。class)privateStringfailType;GetterandSetter}
  内置注解简介如下:
  注解
  说明
  AllEquals
  当前字段及指定字段值必须全部相等
  HasNotNull
  当前字段及指定字段值至少有一个不为null
  EnumRanges
  当前字段值必须在枚举属性范围内
  Ranges
  当前字段值必须在指定属性范围内
  小明在设计验证工具的时候,针对hibernater的不足都做了一点小小的改进。
  可以让字段之间产生联系,以提供更加强大的功能。
  每一个注解都有对应的过程式方法,让你可以在注解式和过程式中切换自如。
  内置了Condition的注解生效条件,让注解生效更加灵活。
  小明抬头看了看墙上的钟,夜已经太深了,百闻不如一见,感兴趣的小伙伴可以自己去感受一下:
  开源地址:https:github。comhoubbvalid小结
  这个开源工具是日常工作中不想写太多校验方法的产物,还处于初期阶段,还有很多需要改进的地方。
  不过,希望你能喜欢。
  我是老马,期待与你的下次重逢。

自动洗碗机常见功能及优势随着生活条件的提高,洗碗机逐渐被家庭、餐饮行业接受和使用,越来越多的家用洗碗机和商用用洗碗机都进入了成千上万的家庭、后厨,解决用餐后洗碗的问题。商用洗碗机,通常是商业目的,用于……华为最强钉子户非它莫属,各方面都可的很金杯银杯不如老百姓的口碑,华为Mate20Pro于去年第四季度发布。直到现在,很多小伙伴仍然对它指名道姓的,可见Mate20Pro是多么深入人心。为什么说Mate20Pr……不能壮士断腕从10到1,必将从10到0尸骨无存近日,SMG总裁高韵斐在上海文广集团的年度工作会议上,提出了从0到1难还是从10到1难的问题。所谓从0到1,就是从无到有开创出一个全新的事业,而从10到1则是积极进行供给侧改革……专访许远东关于扔微波炉事件的十问十答十来天之前,杭州的一位民营企业家因为在公司内部微信群里下周把公司微波炉扔了!的相关言论被公布到网络之后,引起了社会广泛关注,继而引发了网友们关于企业制度、劳资关系的大量讨论。相……工信部整治外链屏蔽,企业搭建独立站趋势将起9月13日,国新办举办新闻发布会,工信部对一些互联网平台相互屏蔽网址的行为作出重要指示,表示将重点整治屏蔽外链问题。这意味着腾讯、阿里等巨头的大平台外链屏蔽局面或将被打破……华为和腾讯的渠道之争华为应用商店下架所有腾讯游戏导读老程是一个电脑硬件的自媒体,但是今天看了华为应用商店下架腾讯所有的手游之后,突然想写一篇关于这两家的文章,虽然在电脑端基本上两家没有什么争端,毕竟华为的笔记本还没有独……20212022私人影院创意设计大赛拍摄指南这是一份适用于案例设计大赛的拍照指南。每年度案例大赛的开启,我们都希望有更多影音设计师可以踊跃地投递优秀的案例作品。如何定义一篇好的作品?大赛评委们各有自己的考量,比如文……比iPhone13还香的手机来啦!iPhoneSE3再次成为还有不到三天,万众期待的数码界盛会苹果秋季发布会就要正式拉开帷幕。这几天,有关iPhone13的各种爆料已经铺天盖地、层出不穷。让大家觉得iPhone13的所有消息均已经被市场……音响影院新品发布暨合作伙伴签约仪式于成都举行9月28日,借2021未来全宅巡回论坛(成都站)举办之际,原声科技于成都总府皇冠假日酒店3楼宴会厅举行了音响影院新品发布暨合作伙伴签约仪式。原声科技是一家基于家庭影院音响……100块钱装台电脑,能办公能玩小游戏,还要啥自行车啊。导读老程今天找到了一块存在我工作间里面很久很久的主板了,现在看着主板接口还挺多,能装一台电脑出来,于是乎老程想着装一台电脑出来玩玩。下面给大家看看主板。CPU……两台一样的8寸掌上电脑,娱乐大师跑分不一样?右边应该是充钱了今天用GPDWINMax做了一个娱乐大师跑分测试,用两台一模一样的WINMax放在一起,同时进行鲁大师跑分会怎么样呢?GPDWINMax是一台8寸掌上电脑游戏掌机,配置英……尔湾大华超市非裔顾客撞倒员工推走一车商品不付款视频曝光洛杉矶华人资讯网12月28日报道,日前,在尔湾CulverDr。的99大华超市,有华裔顾客看到一名非裔顾客推着未结账的购物车直接冲出店门,之后驾车逃逸。尔湾居民对如此社会……
2021上半年手游行业报告随着手机从通讯工具变成我们每个人的外挂器官,我们大量的碎片时间和时间缝隙,都借让手机帮助我们用掉。频繁的拿起手机,不断分散着我们的注意力,消耗我们的时间精力,游戏和短视频,绝对……史上最失败的麒麟980手机,价格并不贵,却遭用户冷落不得不说,在过去的几年间,麒麟处理器已经具备了与骁龙抗衡的实力。尤其是从今年的麒麟980开始,它将了骁龙855一军,提前两个多月首发,成为安卓阵营第一颗7nm芯片。在过去……听见她说上了热搜,而我们却希望这些事不要再上热搜今天是国际消除家庭暴力日,听见她说的同时,希望大家能听到更多的声音。YONGNUO永诺作者:YONGNUO永诺112516:11今天是国际消除家庭暴力日,听见她说的……百元多模无线鼠标,我选了它几乎每一台PC都离不开键盘鼠标这些日常外设,每个人也都会有自己的切身体会,购买轻薄本后,为了轻薄先后购买了联想N700、雷柏M200Plus等超薄鼠标,但是无奈自己手比较大,轻……周朝阳说几个我见过的不同时期的真实的内容创业赚钱项目2015年底开始唱衰微信公众号的人络绎不绝,那个时候我在公司里面负责公众号的运营,亲身经历并参与了一段时间。唱衰的同时,说明流量成本越来越高了,门槛越来越有了,所以我仍在201……3种使用机器人的创新方式机器人可以帮助你年迈的父母,教育你的孩子,为你做饭。自成立以来,机器人行业的收入增长迅猛。20182023年,全球机器人市场的复合年增长率预计将达到24。52。意识到机器……2020年10月16日晚,纳斯达克开盘前10医药股占6个今晚美国开盘上来医药股全线飘红,纳斯达斯前10位,医药股占据6位。可以想象美国生病的人有多少?总结起来就是,生病了先去福泰会诊,去亚力克拿药,回到再生元打针,提供拜马林式……redis实战之基础,程序简单操作redisredis程序客户端操作javajedismaven依赖dependencygroupIdredis。clientsgroupIdjedisartifactIdversion3……成熟的作品绝不只为炫技而存在,OriginOS的克制特性经过前段时间的预热,vivo全新操作系统OriginOS终于在11月18日的vivo开发者大会上边正式发布。虽然此前曝光的时候,大家就已经对新系统表现出了浓厚的兴趣,但是此次其……大数据入门Hive应用场景在大数据的发展当中,大数据技术生态的组件,也在不断地拓展开来,而其中的Hive组件,作为Hadoop的数据仓库工具,可以实现对Hadoop集群当中的大规模数据进行相应的数据处理……家长编造事实黑老师,结果上演无间道,网友被利用了今天,一则通告引起了小事儿的关注,剧情的反转犹如看了一场精彩的《无间道》。事情是这样的,日前,微博上一个自称小岛里的大海的网友发帖表示:自己的女儿上小学一年级,孩子……iPhone12和iPhone12Pro服务计划公告!苹果系SK数码科技根据苹果于8月27日官方上发布了一条适用于无声音问题的iPhone12和iPhone12Pro服务计划公告。据该公告发出的内容所得知:目前Apple现已经确认……
友情链接:易事利快生活快传网聚热点七猫云快好知快百科中准网快好找文好找中准网快软网