SpringBoot 使用validation进行数据校验
Validation
Validator主要是校验用户提交的数据的合理性的,比如是否为空了,密码长度是否大于6位,是否是纯数字的
Validation相关注解含义
- @Null 限制只能为null
- @NotNull 限制必须不为null
- @AssertFalse 限制必须为false
- @AssertTrue 限制必须为true
- @DecimalMax(value) 限制必须为一个不大于指定值的数字
- @DecimalMin(value) 限制必须为一个不小于指定值的数字
- @Digits(integer,fraction) 限制必须为一个小数,且整数部分的位数不能超过integer,小数部分的位数不能超过fraction
- @Future 限制必须是一个将来的日期
- @Max(value) 限制必须为一个不大于指定值的数字
- @Min(value) 限制必须为一个不小于指定值的数字
- @Past 限制必须是一个过去的日期
- @Pattern(value) 限制必须符合指定的正则表达式
- @Size(max,min) 限制字符长度必须在min到max之间
- @Past 验证注解的元素值(日期类型)比当前时间早
- @NotEmpty 验证注解的元素值不为null且不为空(字符串长度不为0、集合大小不为0)
- @NotBlank 验证注解的元素值不为空(不为null、去除首位空格后长度为0),不同于@NotEmpty,@NotBlank只应用于字符串且在比较时会去除字符串的空格
- @Email 验证注解的元素值是Email,也可以通过正则表达式和flag指定自定义的email格式
使用示例:
message 代表的就是对应的提示信息
在对应的实体类添加注解限制之后还需要在用到该实体的地方加上@Valid注解
完成这一步骤后进行测试
不输入参数测试得到以下输出结果:
`{
"timestamp": "2018-04-14T08:52:18.500+0000",
"status": 400,
"error": "Bad Request",
"errors": [
{
"codes": [
"NotEmpty.imUser.userName",
"NotEmpty.userName",
"NotEmpty.java.lang.String",
"NotEmpty"
],
"arguments": [
{
"codes": [
"imUser.userName",
"userName"
],
"arguments": null,
"defaultMessage": "userName",
"code": "userName"
}
],
"defaultMessage": "姓名不能为空!",
"objectName": "imUser",
"field": "userName",
"rejectedValue": null,
"bindingFailure": false,
"code": "NotEmpty"
},
{
"codes": [
"NotEmpty.imUser.workId",
"NotEmpty.workId",
"NotEmpty.java.lang.String",
"NotEmpty"
],
"arguments": [
{
"codes": [
"imUser.workId",
"workId"
],
"arguments": null,
"defaultMessage": "workId",
"code": "workId"
}
],
"defaultMessage": "工号不能为空",
"objectName": "imUser",
"field": "workId",
"rejectedValue": null,
"bindingFailure": false,
"code": "NotEmpty"
}
],
"message": "Validation failed for object='imUser'. Error count: 2",
"path": "/user"
}`
可以看到Valid注解确实起到了作用,可是这输出格式不是我们想要的,下面就需要进行输出格式自定义
通过观察看出当参数不符合规范是会抛出BindException异常,这样的话我们就可以通过全局异常捕获来进行自定义格式输出。
全局异常捕获
SpringBoot提供了全局异常捕获注解@ControllerAdvice
首先定义一个全局异常捕获类GlobalExceptionHandler,加上注解ControllerAdvice,如下
在GlobalExceptionHandler类中定义了一个处理异常的方法handlerBindException
主要看方法上的注解:
@ExceptionHandler(BindException.class):ExceptionHandler所有的异常类只要发生
了就会这个注解所修饰的方法所捕获,代表捕获BindException异常
@ResponseBody :返回JSON格式数据
,在抛出BindException异常情况下会携带异常信息进入handlerBindException方法中
在方法中获取我们在实体类中定义的提示信息,并返回。
最后看下经过捕获后异常输出数据:
可以看出输出结果和意向中的一样。