欢迎大家关注今日头条号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前线查看更多精彩分享文章,主要包括源码分析、实际应用、架构思维、职场分享、产品思考