JSR303校验注解和自定义校验注解的使用
引入validation依赖
org.springframework.boot spring-boot-starter-validation
Null检查
@Null(message="") 验证对象是否为null
@NotNull(message="") 验证对象是否不为null,无法查检长度为0的字符串
@NotBlank(message="") 检查约束字符串是不是Null还有被Trim的长度是否大于0,只对字符串,且会去掉前后空格.
@NotEmpty(message="") 检查约束元素是否为NULL或者是EMPTY.
Booelan检查
@AssertTrue(message="") 验证Boolean对象是否为true
@AssertFalse(message="") 验证Boolean对象是否为false
长度检查
@Size(min=,max=,message="")验证对象(Array,Collection,Map,String)长度是否在给定的范围之内
@Length(min=,max=,message="")Validatesthattheannotatedstringisbetweenminandmaxincluded.
日期检查
@Past(message="") 验证Date和Calendar对象是否在当前时间之前
@Future(message="") 验证Date和Calendar对象是否在当前时间之后
@Pattern(regexp="",message="") 验证String对象是否符合正则表达式的规则
数值检查
建议使用在包装类型(Integer这类),不建议使用在int类型上,
因为表单值为“”时无法转换为int,但可以转换为Stirng为"",Integer为null
@Min(message="") 验证Number和String对象是否大等于指定的值
@Max(message="") 验证Number和String对象是否小等于指定的值
@DecimalMax(message="")值不大于约束中指定的最大值.这个约束的参数是一个通过BigDecimal定义的最大值的字符串表示.小数存在精度
@DecimalMin(message="")值必须不小于约束中指定的最小值.这个约束的参数是一个通过BigDecimal定义的最小值的字符串表示.小数存在精度
@Digits(message="") 验证Number和String的构成是否合法
@Digits(integer=,fraction=,message="")验证字符串是否是符合指定格式的数字,interger指定整数精度,fraction指定小数精度。
@Range(min=,max=,message="")检查数字是否介于min和max之间.
@Valid 递归的对关联对象进行校验,如果关联对象是个集合或者数组,那么对其中的元素进行递归校验,如果是一个map,则对其中的值部分进行校验.(是否进行递归验证)
@CreditCardNumber(message="")信用卡验证
@Email(message="") 验证是否是邮件地址,如果为null,不进行验证,算通过验证。
@ScriptAssert(lang=,script=,alias=,message="")
@URL(protocol=,host=,port=,regexp=,flags=,message="")
每一个校验注解都有一个message用来定义错误信息的返回信息,也有一个groups用来定义不同情形写生效的注解,需要传入一个接口类型的类用来定义。
在进行分组校验的情况下,没有携带groups的校验注解不生效,不是一组的也不会生效,使用方式先在要校验的字段标记注解并且填入groups=接口名.class需要编写一个空接口用来标记分组
不分组校验的情况下不标记groups的注解也会生效
在springboot中使用@Validated(value={接口名.class})来指定那个groups生效
自定义校验可以使用@Pattern输入正则表达式,会根据正则校验
在实体中添加校验注解
前端将数据提交给后端的controller、controller通过映射将数据映射到实体,在映射的时候会进行校验,如果校验不通过会通过message填入的信息将错误信息返回给controller中对于的方法
在实体层添加注解,其中message是返回的消息
publicclassPerson{ @NotEmpty(message="姓名不能为空") privateStringname; privateintuserId; @Length(min=6,max=10,message="密码必须在6-10位之间") privateStringpassword; @Email(message="邮箱不符合格式") privateStringemail; }
开启校验
在入请求体参数加上@Valid注解
在springboot中使用@Validated注解,是JSR303规范中springboot的实现
@PostMapping("/person") publicObjectaddPerson(@RequestBody@ValidPersonperson,BindingResultresult){ if(result.hasErrors()){//判断异常,将异常返回 ListallErrors=result.getAllErrors();//获取所有的异常信息 for(ObjectErrorerror:allErrors){ System.out.println(error.getCode()+"\t" +error.getDefaultMessage()); } } returnperson; }
集中处理异常示例代码
importcom.atguigu.common.exception.BizCodeEnume; importcom.atguigu.common.utils.R; importlombok.extern.slf4j.Slf4j; importorg.springframework.validation.BindingResult; importorg.springframework.web.bind.MethodArgumentNotValidException; importorg.springframework.web.bind.annotation.ExceptionHandler; importorg.springframework.web.bind.annotation.RestControllerAdvice; importjava.util.HashMap; importjava.util.Map; /** *集中处理所有异常 */ @Slf4j @RestControllerAdvice(basePackages="抛异常的类全路径") publicclassGulimallExceptionControllerAdvice{ @ExceptionHandler(value=MethodArgumentNotValidException.class) publicRhandleVaildException(MethodArgumentNotValidExceptione){ log.error("数据校验出现问题{},异常类型:{}",e.getMessage(),e.getClass()); BindingResultbindingResult=e.getBindingResult(); MaperrorMap=newHashMap<>(); bindingResult.getFieldErrors().forEach((fieldError)->{ errorMap.put(fieldError.getField(),fieldError.getDefaultMessage()); }); returnR.error(BizCodeEnume.VAILD_EXCEPTION.getCode(),BizCodeEnume.VAILD_EXCEPTION.getMsg()).put("data",errorMap); } @ExceptionHandler(value=Throwable.class) publicRhandleException(Throwablethrowable){ log.error("错误:",throwable); returnR.error(BizCodeEnume.UNKNOW_EXCEPTION.getCode(),BizCodeEnume.UNKNOW_EXCEPTION.getMsg()); } }
自定义校验注解
自定义校验注解必须要有三个内容values,message,groups
也就是必须要哟下面的3行代码
Stringmessage()default"{com.atguigu.common.valid.ListValue.message}"; Class>[]groups()default{}; Class[]payload()default{};
message中{com.atguigu.common.valid.ListValue.message}是默认的返回错误信息
因此需要创建对应的properties/yml文件,并且在其中定义错误信息的值
例如com.atguigu.common.valid.ListValue.message=必须提交指定的值!
同时需要下面这些注解@Target指定注解在那些地方生效,METHOD表示方法、FIELD表示字段其他的类推
@Constraint用来指定自定义校验的校验器,validatedBy={ListValueConstraintValidator.class}表示指定ListValueConstraintValidator.class作为校验器,可以有多个
@Documented @Constraint(validatedBy={ListValueConstraintValidator.class}) @Target({METHOD,FIELD,ANNOTATION_TYPE,CONSTRUCTOR,PARAMETER,TYPE_USE}) @Retention(RUNTIME)
如果找不到类则添加依赖
javax.validation validation-api 2.0.1.Final
完整的自定义校验注解的案例
importjavax.validation.Constraint; importjavax.validation.Payload; importjava.lang.annotation.Documented; importjava.lang.annotation.Retention; importjava.lang.annotation.Target; importstaticjava.lang.annotation.ElementType.*; importstaticjava.lang.annotation.ElementType.TYPE_USE; importstaticjava.lang.annotation.RetentionPolicy.RUNTIME; @Documented @Constraint(validatedBy={ListValueConstraintValidator.class}) @Target({METHOD,FIELD,ANNOTATION_TYPE,CONSTRUCTOR,PARAMETER,TYPE_USE}) @Retention(RUNTIME) public@interfaceListValue{ Stringmessage()default"{com.atguigu.common.valid.ListValue.message}"; Class>[]groups()default{}; Class[]payload()default{}; int[]vals()default{}; }
使用案例
groups指定分组生效
@ListValue(vals={0,1},groups={AddGroup.class,UpdateStatusGroup.class}) privateIntegershowStatus;
要使校验注解生效,需要有一个自定义的校验注解器,实现ConstraintValidator接口需要有两个泛型
第一个是注解类,另一个是校验值的类型
例如
importjavax.validation.ConstraintValidator; importjavax.validation.ConstraintValidatorContext; importjava.util.HashSet; importjava.util.Set; publicclassListValueConstraintValidatorimplementsConstraintValidator{ privateSet set=newHashSet<>(); //初始化方法 @Override publicvoidinitialize(ListValueconstraintAnnotation){ int[]vals=constraintAnnotation.vals(); for(intval:vals){ set.add(val); } } //判断是否校验成功 /** * *@paramvalue需要校验的值 *@paramcontext *@return */ @Override publicbooleanisValid(Integervalue,ConstraintValidatorContextcontext){ returnset.contains(value); } }
进行校验的类,其中BrandEntity中有上面的showStatus字段并且有对应的自定义校验注解
@RequestMapping("/update") publicRupdate(@Validated(UpdateGroup.class)@RequestBodyBrandEntitybrand){ /*业务代码*/ returnR.ok(); }
到此这篇关于JSR303校验注解和自定义校验注解的使用的文章就介绍到这了,更多相关JSR303校验注解内容请搜索毛票票以前的文章或继续浏览下面的相关文章希望大家以后多多支持毛票票!
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。