数据的校验是交互式网站一个不可或缺的功能,前端的 js 校验可以涵盖大部分的校验职责,如用户名唯一性,生日格式,邮箱格式校验等等常用的校验。但是为了避免用户绕过浏览器,使用 http 工具直接向后端请求一些违法数据,服务端的数据校验也是必要的,可以防止脏数据落到数据库中,如果数据库中出现一个非法的邮箱格式,也会让运维人员头疼不已。
引入依赖
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
</dependencies>
我们只需要引入 spring-boot-starter-web 依赖即可,如果查看其子依赖,可以发现如下的依赖:
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-validator</artifactId>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
</dependency>
验证了我之前的描述,web 模块使用了 hibernate-validation,并且 databind 模块也提供了相应的数据绑定功能。
构建启动类
无需添加其他注解,一个典型的启动类
@SpringBootApplication
public class ValidateApp {
public static void main(String[] args) {
SpringApplication.run(ValidateApp.class, args);
}
}
创建需要被校验的实体类
@Data
@ApiModel
public class xxxRequest implements Serializable {
@NotBlank(message = "用户id不能为空")
private String userId;
@NotBlank(message = "反馈分主题不能为空")
private String mainTitle;
@NotBlank(message = "反馈子主题不能为空")
private String slaveTitle;
@NotBlank(message = "问题详情不能为空")
private String questionDetail;
private String imgUrl;
@NotBlank(message = "修改者id不能为空")
private String editUserId;
}
使用一些比较常用的校验注解,还是比较浅显易懂的,字段上的注解名称即可推断出校验内容,每一个注解都包含了 message 字段,用于校验失败时作为提示信息,特殊的校验注解,如 Pattern(正则校验),还可以自己添加正则表达式。
在 @Controller 中校验数据
@Controller
public class FooController {
@PostMapping("/save")
public RestApiResult saveXxx(@RequestBody @Validated xxxRequest req){
xxxService.refreshXxx(req);
}
}
一个最基本的校验就完成了,总结下框架已经提供了哪些校验:
JSR 提供的校验注解 :
@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(regex=,flag=) 被注释的元素必须符合指定的正则表达式
Hibernate Validator 提供的校验注解 :
@NotBlank(message =) 验证字符串非 null,且长度必须大于 0
@Email 被注释的元素必须是电子邮箱地址
@Length(min=,max=) 被注释的字符串的大小必须在指定的范围内
@NotEmpty 被注释的字符串的必须非空
@Range(min=,max=,message=) 被注释的元素必须在合适的范围内
结果