一、概述
在项目中,经常需要验证客户端传过来的数据格式,如果都用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