Java如何使用JSR303校验数据与自定义校验注解
一、自带校验注解实现数据校验
1、web项目导入依赖
org.springframework.boot spring-boot-starter-web
下图可以看到spring-boot-starter-web依赖自动引入了hibernate-validator;
如果感兴趣的话还可以进入hibernate-validator查看引入了什么相关依赖
2、默认注解的使用
在需要校验的字段添加不同校验类型的注解
/** *品牌id */ @NotNull(message="必须提交品牌id") @TableId privateLongbrandId; /** *品牌名 */ @NotBlank(message="品牌名不可为空") privateStringname; /** *品牌logo地址 */ @NotBlank(message="logo必须提交") @URL(message="logo地址格式错误") privateStringlogo; /** *介绍 */ privateStringdescript; /** *显示状态[0-不显示;1-显示] */privateIntegershowStatus; /** *检索首字母-正则校验实现 */ @NotNull(message="首字母必须提交") @Pattern(message="首字母必须是一个字母,且a-z或A-Z",regexp="/^[a-zA-Z]$/") privateStringfirstLetter;
下图是自带的所有校验注解,可以进入查看源码的注释查看如何使用
3、设置谁需要进行数据校验!!!
在接口参数需要校验的对象前标注注解**@Valid**-标明前台提交数据时该对象的字段需要进行数据校验
/** *修改 */ @RequestMapping("/update") publicRupdate(@Valid@RequestBodyAttrGroupEntityattrGroup){ attrGroupService.updateById(attrGroup); returnR.ok(); }
二、如何使用分组校验?
由于不同功能的接口接收的对象数据可能需要校验的字段不同,并不是每一个接口接收的对象的所有字段都需要校验的,所以则需要使用"分组校验"来区分不同的业务需要校验不同的字段,在这里我使用新增业务和修改业务为例。
根据上图可以看到,默认的注解源码不仅可以设置message(消息)还有一个可以设置group(分组)
1、创建分组接口
/** *新增业务分组校验-不需要实现任何业务,只是用来标识身份 */ publicinterfaceAddGroup{ }
/** *修改业务分组校验-不需要实现任何业务,只是用来标识身份 */ publicinterfaceUpdateGroup{ }
2、如何使用分组校验?
2.1、修改Bean每个字段上校验注解,设置group值
/** *品牌id */ @NotNull(message="修改必须提交品牌id",groups={UpdateGroup.class}) @Null(message="新增不需要提交品牌id",groups={AddGroup.class}) @TableId privateLongbrandId; /** *品牌名 */ @NotBlank(message="品牌名不可为空",groups={AddGroup.class,UpdateGroup.class}) privateStringname; /** *品牌logo地址 */ @NotBlank(message="logo必须提交",groups={AddGroup.class}) @URL(message="logo地址格式错误",groups={AddGroup.class,UpdateGroup.class}) privateStringlogo; /** *介绍 */ privateStringdescript; /** *显示状态[0-不显示;1-显示] */ privateIntegershowStatus; /** *检索首字母 */ @NotNull(message="首字母必须提交",groups={AddGroup.class}) @Pattern(message="首字母必须是一个字母,且a-z或A-Z",regexp="/^[a-zA-Z]$/",groups={AddGroup.class,UpdateGroup.class}) privateStringfirstLetter; /** *排序 */ @Min(value=0,groups={AddGroup.class,UpdateGroup.class}) privateIntegersort;
2.2、设置什么业务需要使用什么分组进行校验
/** *保存-使用添加分组校验接口参数对象的字段 */ @RequestMapping("/save") publicRsave(@Validated(value={AddGroup.class})@RequestBodyBrandEntitybrand){ brandService.save(brand); returnR.ok(); }
/** *修改-使用修改分组校验接口参数对象的字段 */ @RequestMapping("/update") publicRupdate(@Validated(value=UpdateGroup.class)@RequestBodyBrandEntitybrand){ brandService.updateById(brand); returnR.ok(); }
此时,不同业务就会校验不同的字段!!!
三、自定义校验注解
1、导入依赖的jar包
javax.validation validation-api 2.0.1.Final
2、编写自定义校验注解
/** *自定义校验注解 *@authormashanghaoyun *@date2020/8/3115:01 */ @Target({METHOD,FIELD,ANNOTATION_TYPE,CONSTRUCTOR,PARAMETER,TYPE_USE}) @Retention(RUNTIME) @Documented @Constraint(validatedBy={}) public@interfaceListValue{ Stringmessage()default"{com.mashanghaoyun.common.valid.ListValue.message}"; Class>[]groups()default{}; Class[]payload()default{}; int[]vals()default{}; }
3、编写自定义校验器
/** *自定义校验器 *@authormashanghaoyun *@date2020/8/3115:15 */ publicclassListValueConstraintValidatorimplementsConstraintValidator{ privateSet set=newHashSet<>(); /** *@Description初始化方法 *@Authormashanghaoyun *@Date15:172020/8/31 *@Param[constraintAnnotation] *@returnvoid **/ @Override publicvoidinitialize(ListValueconstraintAnnotation){ int[]vals=constraintAnnotation.vals(); if(vals.length>0){ for(intval:vals){ set.add(val); } } } /** *@Description判断是否校验成功 *@Authormashanghaoyun *@Date15:182020/8/31 *@Param[value(当前提交校验的值),context] *@returnboolean **/ @Override publicbooleanisValid(Integervalue,ConstraintValidatorContextcontext){ if(set.size()>0){ if(set.contains(value)){ returntrue; } } returnfalse; } }
3、关联自定义注解与校验器
4、使用自定义注解
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。