Spring boot validation校验方法实例
前言
接触springboot一年多,是时候摆脱这种校验方式了233,每个参数都if判断,一眼看过去就是很low的程序员。
Validation有了这个插件就再也不用这样去校验参数了,可以让我们在项目中不用浪费很多时间在参数校验这里,从而更专注于业务逻辑
正文
首先引入依赖
org.springframework.boot spring-boot-starter-web
这里创建一个用户的DTO对象
@Data @ApiModel("用户-表单对象") publicclassSportsUserCreatForm{ @ApiModelProperty(value="用户唯一标识",example="0") @NotNull(groups={Update.class}) privatelongid; @ApiModelProperty(value="所属机构唯一标识(冗余字段)",example="0") privatelongorganizationId; @ApiModelProperty("登录用户名") @NotBlank(message="用户名不能为空") @Length(max=10,message="用户名最长为10位") privateStringloginName; @ApiModelProperty("密码") privateStringpassword; @ApiModelProperty("手机号") privateStringphone; @ApiModelProperty("邮箱") privateStringemail; @ApiModelProperty("性别('MALE','FEMALE')") @NotNull(message="用户性别不能为空") privateSportsUserEnumGendergander; @ApiModelProperty(value="出生日期-13位时间戳",example="0") privatelongbirthday; @ApiModelProperty("身份证号") privateStringidNumber; @ApiModelProperty("用户昵称") privateStringnickname; }
在controller层添加@Validated注解,添加注解之后spring就会逐个校验DTO中加了校验注解的字段,完全通过才可以进入业务处理,否则就会抛出MethodArgumentNotValidException异常
@PostMapping("user/add") @RequiresAuthentication @ApiOperation("添加用户") publicSportsUseraddUser(@Validated@RequestBodySportsUserCreatFormuser)throwsException{ returnuserBiz.addUser(user); }
一般项目来说抛出异常都会有约定好的JSON格式返回错误码和错误信息,如果不处理就无法按照约定格式返回。这里我们可以通过声明全局异常处理类来拦截异常并将异常处理成前端能操作的JSON数据。(这里只需要关注MethodArgumentNotValidException异常)
@Slf4j @Order(Ordered.HIGHEST_PRECEDENCE) @RestControllerAdvice publicclassGlobalExceptionAdvice{ @ExceptionHandler(MethodArgumentNotValidException.class) @ResponseBody publicResponseEntity
分组校验
有的人就要发问了,"啊,你这校验不行啊,我在添加的时候id是自动生成的不需要校验,编辑的时候就需要校验id了,我是不是要建两个一模一样的DTO,这样岂不是显得我很憨?!这不是增加无用代码吗?差评!"
其实不然,在此我们可以用到groups属性来解决此场景下的问题。
声明分组
注意:在声明分组的时候尽量继承extendjavax.validation.groups.Default。否则,在你声明@Validated(Update.class)的时候,就会出现你在默认没添加groups={}的时候的校验组@Email(message="邮箱格式不对")不会自动校验,因为默认的校验组是groups={Default.class}。
importjavax.validation.groups.Default; /** *数据新增分组 */ publicinterfaceCreateextendsDefault{ }
importjavax.validation.groups.Default; /** *数据更新分组 */ publicinterfaceUpdateextendsDefault{ }
修改Controller中的@Validated注解,声明校验分组(下面用的是Create.class所以并不会校验id)
@PostMapping("user/add") @RequiresAuthentication @ApiOperation("添加用户") publicSportsUseraddUser(@Validated(Create.class)@RequestBodySportsUserCreatFormuser)throwsException{ returnuserBiz.addUser(user); }
下面附上注解说明
验证注解 | 验证的数据类型 | 说明 |
---|---|---|
@AssertFalse | Boolean,boolean | 验证注解的元素值是false |
@AssertTrue | Boolean,boolean | 验证注解的元素值是true |
@NotNull | 任意类型 | 验证注解的元素值不是null |
@Null | 任意类型 | 验证注解的元素值是null |
@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要求一样 | 验证注解的元素值的整数位数和小数位数上限 |
@Size(min=下限,max=上限) | 字符串、Collection、Map、数组等 | 验证注解的元素值的在min和max(包含)指定区间之内,如字符长度、集合大小 |
@Past | java.util.Date,java.util.Calendar;JodaTime类库的日期类型 | 验证注解的元素值(日期类型)比当前时间早 |
@Future | 与@Past要求一样 | 验证注解的元素值(日期类型)比当前时间晚 |
@NotBlank | CharSequence子类型 | 验证注解的元素值不为空(不为null、去除首位空格后长度为0),不同于@NotEmpty,@NotBlank只应用于字符串且在比较时会去除字符串的首位空格 |
@Length(min=下限,max=上限) | CharSequence子类型 | 验证注解的元素值长度在min和max区间内 |
@NotEmpty | CharSequence子类型、Collection、Map、数组 | 验证注解的元素值不为null且不为空(字符串长度不为0、集合大小不为0) |
@Range(min=最小值,max=最大值) | BigDecimal,BigInteger,CharSequence,byte,short,int,long等原子类型和包装类型 | 验证注解的元素值在最小值和最大值之间 |
@Email(regexp=正则表达式,flag=标志的模式) | CharSequence子类型(如String) | 验证注解的元素值是Email,也可以通过regexp和flag指定自定义的email格式 |
@Pattern(regexp=正则表达式,flag=标志的模式) | String,任何CharSequence的子类型 | 验证注解的元素值与指定的正则表达式匹配 |
@Valid | 任何非原子类型 | 指定递归验证关联的对象如用户对象中有个地址对象属性,如果想在验证用户对象时一起验证地址对象的话,在地址对象上加@Valid注解即可 |
此处只列出HibernateValidator提供的大部分验证约束注解,请参考hibernatevalidator官方文档了解其他验证约束注解和进行自定义的验证约束注解定义。
常用的几个: 1.@NotNull:不能为null,但可以为empty(""," "," ") 2.@NotEmpty:不能为null,而且长度必须大于0 (" "," ") 3.@NotBlank:只能作用在String上,不能为null,而且调用trim()后,长度必须大于0("test") 即:必须有实际字符
总结
到此这篇关于Springbootvalidation校验的文章就介绍到这了,更多相关Springbootvalidation校验内容请搜索毛票票以前的文章或继续浏览下面的相关文章希望大家以后多多支持毛票票!
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。