SpringBoot 提供数据校验
通常情况下我们手动的进行判断,这样子很是麻烦,代码量显得很是繁琐,springboot为我们进行简化工作量。
基于 Hibernate Validator 提供了 JSR 规范中所有内置约束注解的实现,以及一些附加的约束注解,除此之外用户还可以自定义约束注解。
Spring Boot 的参数校验依赖于 hibernate-validator 来进行。使用 Hibernate Validator 校验数据,需要定义一个接收的数据模型,使用注解的形式描述字段校验的规则,以 User 对象为例如何使用。
其他的一些校验注解
Hibernate Validator 基本上包含了常用的数据校验,包括校验属性是否为空、长度、大小、特定格式等,完整的注解可以看下表:
注解 应用目标 运行时检查 Hibernate 元数据影响
@Length(min=, max=) 属性(String) 检查字符串长度是否符合范围 列长度会被设到最大值
@Max(value=) 属性(以 numeric 或者 string 类型来表示一个数字) 检查值是否小于或等于最大值 对列增加一个检查约束
@Min(value=) 属性(以 numeric 或者 string 类型来表示一个数字) 检查值是否大于或等于最小值 对列增加一个检查约束
@NotNull 属性 检查值是否非空(not null) 列不为空
@Past 属性(date 或 calendar) 检查日期是否是过去时 对列增加一个检查约束
@Future 属性(date 或 calendar) 检查日期是否是将来时 无
@Pattern(regex="regexp", flag=) 属性(string) 检查属性是否与给定匹配标志的正则表达式相匹配(见 java.util.regex.Pattern ) 无
@Range(min=, max=) 属性(以 numeric 或者 string 类型来表示一个数字) 检查值是否在最小和最大值之间(包括临界值) 对列增加一个检查约束
@Size(min=, max=) 属性(array,collection,map) 检查元素大小是否在最小和最大值之间(包括临界值) 无
@AssertFalse 属性 检查方法的演算结果是否为 false(对以代码方式而不是注解表示的约束很有用) 无
@AssertTrue 属性 检查方法的演算结果是否为 true(对以代码方式而不是注解表示的约束很有用) 无
@Valid 属性(object) 对关联对象递归进行验证。如果对象是集合或数组,就递归地验证其元素;如果对象是 Map,则递归验证其值元素 无
@Email 属性(String) 检查字符串是否符合有效的 email 地址规范 无
环境以及版本:
SpringBoot : 2.0.5.RELEASE
JDK :1.8
maven 依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
User类:
public class User {
@NotBlank(message = "不能为空。")
@Length(min = 2,max = 10,message = "你的长度不对劲呀")
private String name;
@Max(value = 100,message = "不能大于100")
private int age;
@Max(value = 2,message = "111")
private String url;
get set 省略
}
Controller 数据校验
1 @Valid 表示对user这个对象进行校验
2 BindingResult 表示将校验不通过的结果数据绑定到此对象上。
@RestController
public class validController {
@RequestMapping("test")
public List<ObjectError> test(@Valid User user, BindingResult result) {
if(result.hasErrors()){
List<ObjectError> allErrors = result.getAllErrors();
for (ObjectError error : allErrors) {
System.out.println(error.getCode()+ "-" + error.getDefaultMessage());
}
return allErrors;
}
//List<User> list = userService.findAll();
return null;
}
}
测试:
结果
Length-你的长度不对劲呀
NotBlank-不能为空。
返回的json :
[
{
"codes": [
"Max.user.age",
"Max.age",
"Max.int",
"Max"
],
"arguments": [
{
"codes": [
"user.age",
"age"
],
"arguments": null,
"defaultMessage": "age",
"code": "age"
},
100
],
"defaultMessage": "不能大于100",
"objectName": "user",
"field": "age",
"rejectedValue": 190,
"bindingFailure": false,
"code": "Max"
},
{
"codes": [
"NotBlank.user.name",
"NotBlank.name",
"NotBlank.java.lang.String",
"NotBlank"
],
"arguments": [
{
"codes": [
"user.name",
"name"
],
"arguments": null,
"defaultMessage": "name",
"code": "name"
}
],
"defaultMessage": "不能为空。",
"objectName": "user",
"field": "name",
"rejectedValue": "",
"bindingFailure": false,
"code": "NotBlank"
},
{
"codes": [
"Length.user.name",
"Length.name",
"Length.java.lang.String",
"Length"
],
"arguments": [
{
"codes": [
"user.name",
"name"
],
"arguments": null,
"defaultMessage": "name",
"code": "name"
},
10,
2
],
"defaultMessage": "你的长度不对劲呀",
"objectName": "user",
"field": "name",
"rejectedValue": "",
"bindingFailure": false,
"code": "Length"
}
]
期间遇到问题:
1 一直揭没有提示 @Valid 这个注解,刷新maven 或者重新下载 springboot 依赖。
2 不用导入javax.validxxx验证包(会跟默认的验证冲突,导致服务不能启动),此包在springboot中内置会下载。
网友评论