springboot数据格式验证(一)
一、概述
在项目中,经常需要验证客户端传过来的数据格式,如果都用if else手写,可能会累死,其实javax.validation
包与hibernate-validator
包中注解能满足大部分需求
我们先来熟悉一下
引用jar包不说明依赖都是耍流氓,所以我先把用到的依赖粘贴在这里
<!--jsr 303--> <dependency> <groupId>javax.validation</groupId> <artifactId>validation-api</artifactId> <version>1.1.0.Final</version> </dependency> <!-- hibernate validator--> <dependency> <groupId>org.hibernate</groupId> <artifactId>hibernate-validator</artifactId> <version>5.2.0.Final</version> </dependency>
二、常用验证注解
常用的注解大概就这些,大部分都是应用在model类的字段上,大概能解决80%的问题
@Null 被注释的元素必须为null
@NotNull 被注释的元素不能为null
@AssertTrue 被注释的元素必须为true
@AssertFalse 被注释的元素必须为false
@Min(value) 被注释的元素必须是一个数字,其值必须大于等于指定的最小值
@Max(value) 被注释的元素必须是一个数字,其值必须小于等于指定的最大值
@DecimalMin(value) 被注释的元素必须是一个数字,其值必须大于等于指定的最小值
@DecimalMax(value) 被注释的元素必须是一个数字,其值必须小于等于指定的最大值
@Size(max,min) 被注释的元素的大小必须在指定的范围内。
@Digits(integer,fraction) 被注释的元素必须是一个数字,其值必须在可接受的范围内
@Past 被注释的元素必须是一个过去的日期
@Future 被注释的元素必须是一个将来的日期
@Pattern(value) 被注释的元素必须符合指定的正则表达式。
@Email 被注释的元素必须是电子邮件地址
@Length 被注释的字符串的大小必须在指定的范围内
@NotEmpty 被注释的字符串必须非空
@Range 被注释的元素必须在合适的范围内
Hibernate Validator 提供的校验注解:
@NotBlank(message =) 验证字符串非 null,且长度必须大于 0 @Email 被注释的元素必须是电子邮箱地址 @Length(min=,max=) 被注释的字符串的大小必须在指定的范围内 @NotEmpty 被注释的字符串的必须非空 @Range(min=,max=,message=) 被注释的元素必须在合适的范围内
用起来其实很简单,我展示一个例子,下面的model类Tables映射为一张表,有些关键字段肯定是不能为空的,我都用@NotNull注解进行了标识
@Data @Table(name = "tables", uniqueConstraints = {@UniqueConstraint(columnNames = {"tbName"})}) public class Tables implements Serializable { private static final long serialVersionUID = -3596411984380984035L; @ApiModelProperty("表名,必须为英文小写") @NotNull(message = "tbName不能为空") private String tbName; @ApiModelProperty("表描述") @NotNull(message = "chineseName不能为空") private String chineseName; @ApiModelProperty("表唯一键") private String uniqueKey; @ApiModelProperty("创建日期") @DateFormat(format = "yyyy-MM-dd",message = "日期格式错误,正确格式为yyyy-MM-dd") private String createDate; }
三、controller层的使用
在controller层使用的时候一定要在待校验参数前加@Validated注解才能生效
@PostMapping("addTable") @ApiOperation("增加一个表") public BaseResponse<String> addTable(@Validated @RequestBody Tables tables, BindingResult br) { if (br.hasErrors()) { String defaultMessage = br.getFieldError().getDefaultMessage(); return BaseResultUtils.error(defaultMessage); } else { modelService.createTB(tables); return BaseResultUtils.success(null); } }
四、返回给前端
错误日志打印给自己虽然有用,但不如直接返回到前端更智能,为了实现这个功能,就需要用到上面方法中的BindingResult,它保存了验证得到的错误,将错误拿出来就可以返回给前端
大概是如下这种效果
参考:https://www.jianshu.com/p/253642121891