spring boot validation参数校验实例分析
本文实例讲述了springbootvalidation参数校验。分享给大家供大家参考,具体如下:
对于任何一个应用而言在客户端做的数据有效性验证都不是安全有效的,这时候就要求我们在开发的时候在服务端也对数据的有效性进行验证。SpringBoot自身对数据在服务端的校验有一个比较好的支持,它能将我们提交到服务端的数据按照我们事先的约定进行数据有效性验证。
1pom依赖
org.springframework.boot spring-boot-starter-validation
2校验使用实例
- 配置要验证的请求实体
publicclassUser{ @Null privateLongid; @NotBlank privateStringname; @Email privateStringemail; //省略getter和setter }
- 控制器方法配置
@PostMapping("/addUser") publicStringaddUser(@Valid@RequestBodyUseruser){ ... }
- 校验失败统一处理
校验失败时将抛出MethodArgumentNotValidException异常
/** *全局Exception处理 * *@authorliusq * */ @RestControllerAdvice publicclassGlobalExceptionHandler{ privatestaticfinalLoggerLOGGER=LoggerFactory.getLogger(GlobalExceptionHandler.class); @SuppressWarnings("rawtypes") @ExceptionHandler(value=Exception.class) publicResponseEntityhandle(Exceptione){ if(einstanceofMethodArgumentNotValidException){ BindingResultbindingResult=((MethodArgumentNotValidException)e).getBindingResult(); if(bindingResult.hasErrors()&&bindingResult.hasFieldErrors()){ FieldErrorfieldError=bindingResult.getFieldError(); BodyValidStatusbodyValidStatus=newBodyValidStatus.Builder().code("0009") .message(fieldError.getDefaultMessage()) .field(fieldError.getField()).build(); LOGGER.warn(bodyValidStatus.getMessage()+e); returnnewResponseEntity<>(bodyValidStatus,HttpStatus.OK); }else{ bodyStatus=DataUtil.bodyStatus("0009"); } }else{ bodyStatus=DataUtil.bodyStatus(Constants.ERROR_CODE); } LOGGER.error(bodyStatus.getMessage()+e); returnnewResponseEntity<>(bodyStatus,HttpStatus.OK); } } publicclassBodyValidStatus{ //错误代码 privateStringcode; //错误代码解释 privateStringmessage; //错误字段 privateStringfield; publicBodyValidStatus(){ } publicBodyValidStatus(Stringcode,Stringmessage,Stringfield){ this.code=code; this.message=message; this.field=field; } privateBodyValidStatus(Builderbuilder){ setCode(builder.code); setMessage(builder.message); setField(builder.field); } publicStringgetCode(){ returncode; } publicvoidsetCode(Stringcode){ this.code=code; } publicStringgetMessage(){ returnmessage; } publicvoidsetMessage(Stringmessage){ this.message=message; } publicStringgetField(){ returnfield; } publicvoidsetField(Stringfield){ this.field=field; } @Override publicStringtoString(){ returnToStringBuilder.reflectionToString(this); } publicstaticfinalclassBuilder{ privateStringcode; privateStringmessage; privateStringfield; publicBuilder(){ } publicBuildercode(Stringval){ code=val; returnthis; } publicBuildermessage(Stringval){ message=val; returnthis; } publicBuilderfield(Stringval){ field=val; returnthis; } publicBodyValidStatusbuild(){ returnnewBodyValidStatus(this); } } }
3验证注解详解
验证注解 |
验证的数据类型 |
说明 |
空检查 |
||
@Null |
任意类型 |
验证注解的元素值是null |
@NotNull |
任意类型 |
验证注解的元素不是null |
@NotBlank |
CharSequence子类型(CharBuffer、String、StringBuffer、StringBuilder) |
验证注解的元素值不为空(不为null、去除首尾空格后长度不为0),不同于@NotEmpty,@NotBlank只应用于字符串且在比较时会去除字符串的首尾空格 |
@NotEmpty |
CharSequence子类型、Collection、Map、数组 |
验证注解的元素值不为null且不为空(字符串长度不为0、集合大小不为0) |
Boolean检查 |
||
@AssertFalse |
Boolean,boolean |
验证注解的元素值是false |
@AssertTrue |
Boolean,boolean |
验证注解的元素值是true |
长度检查 |
||
@Size(min=下限,max=上限) |
字符串、Collection、Map、数组等 |
验证注解的元素值的在min和max(包含)指定区间之内,如字符长度、集合大小 |
@Length(min=下限,max=上限) |
CharSequence子类型 |
验证注解的元素值长度在min和max区间内 |
日期检查 |
||
@Past |
java.util.Date,java.util.Calendar;JodaTime类库的日期类型 |
验证注解的元素值(日期类型)比当前时间早 |
@Future |
与@Past要求一样 |
验证注解的元素值(日期类型)比当前时间晚 |
数值检查 |
||
@MIN(value=值) |
BigDecimal,BigInteger,byte,short,int,long,等任何Number或CharSequence(存储的是数字)子类型 |
验证注解的元素值大于等于@Min指定的value值 |
@MAX(value=值) |
和@Min要求一样 |
验证注解的元素值小于等于@Max指定的value值 |
@DecimalMin(value=值) |
和@Min要求一样 |
验证注解的元素值大于等于@DecimalMin指定的value值 |
@DecimalMax(value=值) |
和@Min要求一样 |
验证注解的元素值小于等于@DecimalMax指定的value值 |
@Digits(integer=整数位数,fraction=小数位数) |
和@Min要求一样 |
验证注解的元素值的整数位数和小数位数上限 |
@Range(min=最小值,max=最大值) |
BigDecimal,BigInteger,CharSequence,byte,short,int,long等原子类型和包装类型 |
验证注解的元素值在最小值和最大值之间 |
其他检查 |
||
@Valid |
任何非原子类型 |
指定递归验证关联的对象;如用户对象中有个地址对象属性,如果想在验证用户对象时一起验证地址对象的话,在地址对象上加@Valid注解即可级联验证 |
@Pattern(regexp=正则表达式,flag=标志的模式) |
CharSequence的子类型 |
验证注解的元素值与指定的正则表达式匹配 |
@Email(regexp=正则表达式,flag=标志的模式) |
CharSequence的子类型 |
验证注解的元素值是Email,也可以通过regexp和flag指定自定义的email格式 |
@CreditCardNumber |
CharSequence的子类型 |
验证注解元素值是信用卡卡号 |
@ScriptAssert(lang=,script=) |
业务类 |
校验复杂的业务逻辑 |
4自定义验证注解和验证规则
importjava.lang.annotation.ElementType; importjava.lang.annotation.Retention; importjava.lang.annotation.RetentionPolicy; importjava.lang.annotation.Target; importjavax.validation.Constraint; importjavax.validation.Payload; importcom.xxx.xxx.constraint.impl.MoneyValidator; @Target({ElementType.FIELD,ElementType.METHOD}) @Retention(RetentionPolicy.RUNTIME) @Constraint(validatedBy=MoneyValidator.class) public@interfaceMoney{ Stringmessage()default"不是金额形式"; Class>[]groups()default{}; Class[]payload()default{}; } importjava.util.regex.Pattern; importjavax.validation.ConstraintValidator; importjavax.validation.ConstraintValidatorContext; importcom.xxx.xxx.constraint.Money; publicclassMoneyValidatorimplementsConstraintValidator{ privateStringmoneyReg="^\\d+(\\.\\d{1,2})?$";//表示金额的正则表达式 privatePatternmoneyPattern=Pattern.compile(moneyReg); publicvoidinitialize(Moneymoney){ //TODOAuto-generatedmethodstub } publicbooleanisValid(Doublevalue,ConstraintValidatorContextarg1){ //TODOAuto-generatedmethodstub if(value==null) returntrue; returnmoneyPattern.matcher(value.toString()).matches(); } }
更多关于java相关内容感兴趣的读者可查看本站专题:《Spring框架入门与进阶教程》、《Java数据结构与算法教程》、《Java操作DOM节点技巧总结》、《Java文件与目录操作技巧汇总》和《Java缓存操作技巧汇总》
希望本文所述对大家java程序设计有所帮助。
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。