保健励志美文体育育儿作文
投稿投诉
作文动态
热点娱乐
育儿情感
教程科技
体育养生
教案探索
美文旅游
财经日志
励志范文
论文时尚
保健游戏
护肤业界

自定义validation注解解决动态多字段联动校验问题

  欢迎大家关注今日头条号JAVA前线查看更多精彩分享文章,主要包括源码分析、实际应用、架构思维、职场分享、产品思考1文章概述
  javax。validation是基于JSR303标准定义的一组接口,目的是使开发者简洁地校验参数,hibernatevalidator实现了这一组接口,可以作为工具独立引用。dependencygroupIdjavax。validationgroupIdvalidationapiartifactIdversion1。1。0。FinalversiondependencydependencygroupIdorg。hibernategroupIdhibernatevalidatorartifactIdversion6。0。18。Finalversiondependency
  如果是SpringBoot项目则无需显示引用上述依赖,因为SpringBoot已经将上述依赖进行了集成。
  2基本使用2。1定义模型importjava。math。BigDecimal;importjava。util。List;importjavax。validation。constraints。DecimalMin;importjavax。validation。constraints。Max;importjavax。validation。constraints。Min;importjavax。validation。constraints。NotBlank;importjavax。validation。constraints。Size;importlombok。Data;DatapublicclassOrderModelA{Min(value1,message订单编号必须大于等于1)Max(value100,message订单编号必须小于等于100)privateIntegerorderId;NotBlank(message订单名称不能为空)privateStringorderName;Size(min1,max10)privateListStringgoodsList;DecimalMin(value1,message订单金额必须大于等于1)privateBigDecimalamount;}
  2。2定义接口importjavax。validation。Valid;importjavax。validation。constraints。NotNull;importorg。springframework。validation。annotation。Validated;importcom。java。front。validation。model。OrderModelA;ValidatedpublicinterfaceBizValidateService{voidbizMethodA(ValidOrderModelAmodel,NotNullStringparam);}
  2。3接口实现importjavax。validation。Valid;importjavax。validation。constraints。NotNull;importorg。springframework。stereotype。Component;importcom。alibaba。fastjson。JSON;importcom。java。front。validation。model。OrderModelA;ComponentpublicclassBizValidateServiceImplimplementsBizValidateService{OverridepublicvoidbizMethodA(ValidOrderModelAmodel,NotNullStringparam){System。out。println(executebizAmodelJSON。toJSONString(model),paramparam);}}
  2。4测试用例RunWith(SpringRunner。class)SpringBootTestpublicclassTestAuthApplication{AutowiredprivateBizValidateServicebizValidateService;TestpublicvoidtestBizValidateAcorrect(){OrderModelAmodelnewOrderModelA();model。setOrderId(1);model。setOrderName(订单名称);ListStringgoodsListnewArrayListString();goodsList。add(goods1);goodsList。add(goods2);goodsList。add(goods3);model。setGoodsList(goodsList);model。setAmount(newBigDecimal(10));bizValidateService。bizMethodA(model,param);}TestpublicvoidtestBizValidateAerror(){OrderModelAmodelnewOrderModelA();model。setOrderId(0);model。setOrderName(订单名称);ListStringgoodsListnewArrayListString();goodsList。add(goods1);goodsList。add(goods2);goodsList。add(goods3);model。setGoodsList(goodsList);model。setAmount(newBigDecimal(10));bizValidateService。bizMethodA(model,param);}}
  2。5报错信息javax。validation。ConstraintViolationException:bizMethodA。model。orderId:订单编号必须大于等于1atorg。springframework。validation。beanvalidation。MethodValidationInterceptor。invoke(MethodValidationInterceptor。java:117)atorg。springframework。aop。framework。ReflectiveMethodInvocation。proceed(ReflectiveMethodInvocation。java:186)atorg。springframework。aop。framework。CglibAopProxyCglibMethodInvocation。proceed(CglibAopProxy。java:747)atorg。springframework。aop。framework。CglibAopProxyDynamicAdvisedInterceptor。intercept(CglibAopProxy。java:689)atcom。java。front。validation。BizValidateServiceImplEnhancerBySpringCGLIB42c25c43。bizMethodA(generated)atcom。java。front。TestAuthApplication。testBizValidateAerror(TestAuthApplication。java:62)
  3复杂应用
  现在我们假设一种场景订单新增了type1、type2两个字段,这两个字段影响对于orderId值范围判断,也就是说orderId范围判断不再是静态的,而是受其它字段影响。
  针对这种情况第一步我们可以构造type1、type2、orderId组合字段,第二步自定义校验器将组合字段拆开进行业务校验。
  3。1定义注解importjava。lang。annotation。Documented;importjava。lang。annotation。ElementType;importjava。lang。annotation。Retention;importjava。lang。annotation。RetentionPolicy;importjava。lang。annotation。Target;importjavax。validation。Constraint;importjavax。validation。Payload;DocumentedRetention(RetentionPolicy。RUNTIME)Target({ElementType。PARAMETER,ElementType。FIELD,ElementType。METHOD})Constraint(validatedByTypeAndOrderIdValidator。class)publicinterfaceTypeAndOrderIdValid{Stringmessage()default不满足业务条件;Classlt;?〔〕groups()default{};Classlt;?extendsPayload〔〕payload()default{};}
  3。2定义校验器importjavax。validation。ConstraintValidator;importjavax。validation。ConstraintValidatorContext;importcom。java。front。validation。model。OrderModelB;publicclassTypeAndOrderIdValidatorimplementsConstraintValidatorTypeAndOrderIdValid,String{OverridepublicbooleanisValid(Stringvalue,ConstraintValidatorContextcontext){String〔〕arrayvalue。split(OrderModelB。JOINT);inttype1Integer。parseInt(array〔0〕);inttype2Integer。parseInt(array〔1〕);intorderIdInteger。parseInt(array〔2〕);if(type11type22){returnorderId20;}returntrue;}}
  3。3定义模型importjava。math。BigDecimal;importjava。util。List;importjavax。validation。constraints。DecimalMin;importjavax。validation。constraints。Max;importjavax。validation。constraints。Min;importjavax。validation。constraints。NotBlank;importjavax。validation。constraints。Size;importcom。alibaba。fastjson。annotation。JSONField;importcom。java。front。server。validation。extend。TypeAndOrderIdValid;importlombok。Data;DatapublicclassOrderModelB{publicstaticfinalStringJOINT;Min(value1,message订单编号必须大于等于1)Max(value100,message订单编号必须小于等于100)privateIntegerorderId;NotBlank(message订单名称不能为空)privateStringorderName;Size(min1,max10)privateListStringgoodsList;DecimalMin(value1,message订单金额必须大于等于1)privateBigDecimalamount;privateinttype1;privateinttype2;JSONField(serializefalse)privateStringtypeAndOrderIdComposite;TypeAndOrderIdValidpublicStringgetTypeAndOrderIdComposite(){returngetType1()JOINTgetType2()JOINTgetOrderId();}}
  3。4定义接口importjavax。validation。Valid;importjavax。validation。constraints。NotNull;importorg。springframework。validation。annotation。Validated;importcom。java。front。validation。model。OrderModelB;ValidatedpublicinterfaceBizValidateService{voidbizMethodB(ValidOrderModelBmodel,NotNullStringparam);}
  3。5接口实现importjavax。validation。Valid;importjavax。validation。constraints。NotNull;importorg。springframework。stereotype。Component;importcom。alibaba。fastjson。JSON;importcom。java。front。server。validation。model。OrderModelB;ComponentpublicclassBizValidateServiceImplimplementsBizValidateService{OverridepublicvoidbizMethodB(ValidOrderModelBmodel,NotNullStringparam){System。out。println(executebizBmodelJSON。toJSONString(model),paramparam);}}
  3。6测试用例RunWith(SpringRunner。class)SpringBootTestpublicclassTestAuthApplication{AutowiredprivateBizValidateServicebizValidateService;TestpublicvoidtestBizValidateBcorrect(){OrderModelBmodelnewOrderModelB();model。setOrderId(30);model。setOrderName(订单名称);ListStringgoodsListnewArrayListString();goodsList。add(goods1);goodsList。add(goods2);goodsList。add(goods3);model。setGoodsList(goodsList);model。setAmount(newBigDecimal(10));model。setType1(1);model。setType2(2);bizValidateService。bizMethodB(model,param);}TestpublicvoidtestBizValidateBerror(){OrderModelBmodelnewOrderModelB();model。setOrderId(1);model。setOrderName(订单名称);ListStringgoodsListnewArrayListString();goodsList。add(goods1);goodsList。add(goods2);goodsList。add(goods3);model。setGoodsList(goodsList);model。setAmount(newBigDecimal(10));model。setType1(1);model。setType2(2);bizValidateService。bizMethodB(model,param);}}
  3。7错误信息javax。validation。ConstraintViolationException:bizMethodB。model。typeAndOrderIdComposite:不满足业务条件atorg。springframework。validation。beanvalidation。MethodValidationInterceptor。invoke(MethodValidationInterceptor。java:117)atorg。springframework。aop。framework。ReflectiveMethodInvocation。proceed(ReflectiveMethodInvocation。java:186)atorg。springframework。aop。framework。CglibAopProxyCglibMethodInvocation。proceed(CglibAopProxy。java:747)atorg。springframework。aop。framework。CglibAopProxyDynamicAdvisedInterceptor。intercept(CglibAopProxy。java:689)atcom。java。front。validation。BizValidateServiceImplEnhancerBySpringCGLIB7c26a7cb。bizMethodB(generated)atcom。java。front。server。TestAuthApplication。testBizValidateBerror(TestAuthApplication。java:94)
  4文章总结
  本文第一章节介绍了validation基本概念,第二章节介绍了validation基本应用,第三章节介绍了通过自定义注解动态校验字段,希望本文对大家有所帮助。
  欢迎大家关注今日头条号JAVA前线查看更多精彩分享文章,主要包括源码分析、实际应用、架构思维、职场分享、产品思考

雪,有人在盼望着你气象台预报着最近会有雪有人在盼望着我也在盼望着第一次你是来也匆匆去也匆匆还没来得及欣赏你却又陪着太阳走尽了天涯昨晚开始你就在酝酿着让冷……描写家规家训作文俗话说:无规矩不成方圆。好的规矩从家规家训开始。那么,下面是小编给大家整理收集的描写家规家训作文,希望大家喜欢。篇一:描写家规家训作文《左传定公十年》书:中国有礼仪之大故……哀鸿遍野的历史成语故事解释:比喻到处都是呻吟呼号、游离失所的灾民。哀鸿:哀鸣的大雁。《诗经小雅》中有一篇题为《鸿雁》的诗。其中有两句是:鸿雁于飞,哀呜嗷嗷。它的意思是说:鸿雁找不到……人人为我我为人人人人为我我为人人人人为我,我为人人的意思是:在生活中,许多人为我服务,因此,我也要尽力为他人服务。但人人为我必须是建立在我为人人的基础上的。因为,如果一个人自私自利,不去……现代与起亚一季度新能源车出口量合计首次突破10万辆同比增加2李嫒嫒中国证券报中证网中证网讯(记者李嫒嫒)5月1日,据韩国汽车产业协会发布的数据,今年一季度现代和起亚的新能源汽车出口量合计首次突破10万辆,为11。1252万辆,同比……你觉得买回来就吃灰的数码产品有哪些?在悟空问答上的606个问题,只写接地气的科技内容,欢迎关注。购物一时爽,一直购物一直爽。爽完之后,看看花呗和信用卡,想死的心都有。。。。。。讲一讲自己的体验吧,那些……国家重点研发集成电路电子设计自动化(EDA)项目顺利过评国家重点研发计划基于高性能计算的集成电路电子设计自动化(EDA)平台项目顺利通过综合绩效评价2022年3月10日,由中科院微电子所EDA中心陈岚研究员牵头承担的国家重点研……学会感恩(转载)大家好,今天我演讲的题目是《学会感恩》曾听过这么一个美丽的传说:上帝造物时,因为希望人间多些温暖,便将恩情的嫩芽撒播于人类的心田,恰若阳光普照大地,细雨滋润禾苗,春风轻抚……致老同桌的一封信1200字老同桌:见信好!前几天,你提起了对我的第一印象:好动、英语课上胸有成竹。当时我好感动,为你的诚心和细心。这一刻发生在三年前的秋天,我们从各个乡镇聚到县城的一所重点高……桃花点点无边落叶萧萧下,不尽思绪滚滚来。你曾对我说过,你喜欢桃花。你喜欢它的鲜艳,你喜欢它的美丽。你说它像天上的仙子,我却认为它只不过是朵普普通通的花儿。每当桃花盛开的时候……尊严的话题作文600字篇一:尊严在生活中,尊严代表了一个人的人格和价值。在历史的长河中,就有许许多多宁可牺牲自己的生命也不放弃自己的尊严的人。有一次,我在书中看见了一个故事mdash;m……女朋友想要装个洗碗机,有没有用过的来给点建议?每个人的家里,最有烟火气的地方大概就是厨房了吧,一日三餐,柴米油盐,支撑起了温馨的小日子。美餐过后,洗碗却成了令人头疼的问题,因此不少家庭选择洗碗机来解放双手。而在选购的时候,……
联想小新Air14Plus售价4599元起搭载2。2K屏独显3月21日,联想小新Air14Plus好价来袭,着急用电脑的小伙伴们今天可以下手了,不着急的小伙伴们可以等等新品。本次特惠的联想小新Air14Plus包括酷睿版和锐龙版,……伟大的母爱作文有一个人,她最伟大;有一个人,她最温柔;有一个人,她最勤劳;有一个人,她最细心!她是谁?她就是我的母亲!下文是小编分享的伟大的母爱作文,欢迎阅读。伟大的母爱作文一我最喜欢……孝道作文600字百善孝为先孝顺是作为人最应尽的责任和义务。正所谓百善孝为先,可见孝顺是极其重要的。小编整理了相关的作文范文,欢迎欣赏与借鉴。【孝道作文600字:百善孝为先】什么是孝?孝,是中……再见了,表妹再见了,表妹表妹,你知道吗我很喜欢逗你笑很喜欢抱你出去逛街很喜欢和你一起玩很喜欢陪着你我离不开你可是我终究只是你的表姐而不……号称四五百公里,实际二三百公里,新能源汽车续航里程何时不再雾新华社北京3月16日电题:号称四五百公里,实际二三百公里,新能源汽车续航里程何时不再雾里看花?新华社新华视点记者郭宇靖、吉宁购车时厂家宣传续航里程是420公里,销售……写给鲁滨逊的一封信作文400字鲁滨逊:您好!我对你在无名岛上的生活是又害怕又向往,那种大自然的自由勾着我的魂儿,可是一想到那种与世隔绝的孤独我又只能望而生畏。所以,鲁滨逊,我想更深一步地了解你在……唐山大地震的观后感2000字早在7月初的时候,就和爱美阿姨讲好了,请她去万达影城看电影(唐山大地震)。21号下午,迫不及待的她就打电话商议看电影的事宜,我笑她怎么又犯迷糊记错日期了,她则认真地说,这部影片……母爱触动了我的心灵小学作文1000字母爱是水,清洗心灵的水;母爱是山,让你依靠的山;母爱是风,吹散失望的风;母爱是雷,冲击人生的雷。题记如果你问我这世界上最伟大的爱是来自于谁的爱,我会毫不犹豫的告诉你,那是……在中学2011年秋季开学典礼上的讲话亲爱的老师、同学们:你们好!今年的暑热尤为酷烈,天气终于转凉了,新的学年又到了,我们迎来了2011级新同学。首先,让我代表xx一中全体教职员工对新同学的到来表示热烈……成长中的感动作文800字五篇在日复一日的学习、工作或生活中,大家最不陌生的就是作文了吧,根据写作命题的特点,作文可以分为命题作文和非命题作文。为了让您在写作文时更加简单方便,下面是小编为大家收集的成长中的……弘扬中国传统文化作文导语:在当今开放的世界里,我们在吸收外来文化的同时,也要大力弘扬华夏五千年的优秀传统文化。下面是小编为您整理的作文,希望对您有所帮助。篇一:弘扬中国传统文化大家应该都知道……最美的姿态作文1000字当夕阳的柔光将远山映照出一个绵延的剪影,耸立是山的姿态;当溪水在山间抑或原野奔流,蜿蜒是水的姿态。它们都只是无边的大自然创造的一种形式,是一种身影,是一种姿态。是的,它们固然很……
友情链接:易事利快生活快传网聚热点七猫云快好知快百科中准网快好找文好找中准网快软网