SpringBoot使⽤Validation校验参数以及⾃定义注解进⾏参数
校验全局异常拦截
SpringBoot使⽤Validation校验参数以及⾃定义注解进⾏参数校验全局异常拦截
本⽂主要包括:基本注解使⽤及说明,全局异常捕捉,⾃定义注解的实现,@Validated与@Valid的简单对⽐及不同实现
使⽤ Spring Boot 程序的话只需要spring-boot-starter-web 就够了,它的⼦依赖包含了我们所需要的东西。除了这个依赖,下⾯的演⽰还⽤到了 lombok ,所以不要忘记添加上相关依赖。
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
validation框架<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
新建参数类
@Data
public class ValidationModel {
/**
* 主键
*/
@NotNull(message = "主键不能为空")
private Long id;
/**
* 名称
*/
@NotBlank(message = "名称不能为空")
private String name;
/**
* 邮箱
*/
@NotBlank(message = "email 不能为空")
@Email(message = "email 格式不正确")
private String email;
/**
* 年龄
*/
@Range(min = 18, max = 60, message = "年龄必须在 {min} ⾄ {max} 之间")    private String age;
}
⽂档地址: acle/javaee/7/api/javax/validation/constraints/package-frame.html
docs.spring.io/spring/docs/current/spring-framework-reference/core.html#validation
JSR提供的校验注解:
@AssertFalse            被注释的元素只能为false
@AssertTrue            被注释的元素只能为true
@DecimalMax            被注释的元素必须⼩于或等于{value}
@DecimalMin            被注释的元素必须⼤于或等于{value}
@Digits                被注释的元素数字的值超出了允许范围(只允许在{integer}位整数和{fraction}位⼩数范围内)
@Email                  被注释的元素不是⼀个合法的电⼦邮件地址
@Future                被注释的元素需要是⼀个将来的时间
@FutureOrPresent        被注释的元素需要是⼀个将来或现在的时间
@Max                    被注释的元素最⼤不能超过{value}
@Min                    被注释的元素最⼩不能⼩于{value}
@Negative              被注释的元素必须是负数
@NegativeOrZero        被注释的元素必须是负数或零
@NotBlank              被注释的元素不能为空
@NotEmpty              被注释的元素不能为空
@NotNull                被注释的元素不能为null
@Null                  被注释的元素必须为null
@Past                  被注释的元素需要是⼀个过去的时间
@PastOrPresent          被注释的元素需要是⼀个过去或现在的时间
@Pattern                被注释的元素需要匹配正则表达式"{regexp}"
@Positive              被注释的元素必须是正数
@PositiveOrZero        被注释的元素必须是正数或零
@Size                  被注释的元素个数必须在{min}和{max}之间
Hibernate Validator提供的校验注解:
@CreditCardNumber      被注释的元素不合法的信⽤卡号码
@Currency              被注释的元素不合法的货币 (必须是{value}其中之⼀)
@EAN                    被注释的元素不合法的{type}条形码
@Email                  被注释的元素不是⼀个合法的电⼦邮件地址  (已过期)
@Length                被注释的元素长度需要在{min}和{max}之间
@CodePointLength        被注释的元素长度需要在{min}和{max}之间
@LuhnCheck              被注释的元素${validatedValue}的校验码不合法, Luhn模10校验和不匹配
@Mod10Check            被注释的元素${validatedValue}的校验码不合法, 模10校验和不匹配
@Mod11Check            被注释的元素${validatedValue}的校验码不合法, 模11校验和不匹配
@ModCheck              被注释的元素${validatedValue}的校验码不合法, ${modType}校验和不匹配  (已过期)
@NotBlank              被注释的元素不能为空  (已过期)
@NotEmpty              被注释的元素不能为空  (已过期)
@ParametersScriptAssert 被注释的元素执⾏脚本表达式"{script}"没有返回期望结果
@Range                  被注释的元素需要在{min}和{max}之间
@SafeHtml              被注释的元素可能有不安全的HTML内容
@ScriptAssert          被注释的元素执⾏脚本表达式"{script}"没有返回期望结果
@URL                    被注释的元素需要是⼀个合法的URL
@DurationMax            被注释的元素必须⼩于${inclusive == true ? '或等于' : ''}${days == 0 ? '' : days += '天'}${hours == 0 ? '' : hours += '⼩时'}${minutes == 0 ? '    @DurationMin            被注释的元素必须⼤于${inclusive == true ? '或等于' : ''}${days == 0 ? '' : days += '天'}${hours == 0 ? '' : hours += '⼩时'}${minutes == 0 ? ''
在Controller中校验数据
@Slf4j
@RestController
@RequestMapping(value = "/index")
public class IndexController {
@RequestMapping(value = "/save", method = RequestMethod.POST)    public R save(@Validated ValidationModel validationModel) {
log.info("接收到参数为 [{}]", validationModel);
return R.success(validationModel);
}
}
简单封装⼀个返回参数类
@Data
public class R<T> implements Serializable {
private Integer code;
private String message;
private T data;
public R() {
}
public static <T> R<T> success(T data) {
R r = new R();
r.setData(data);
return r;
}
public static R fail() {
R r = new R();
r.setCode(500);
r.setMessage("FAIL");
return r;
}
public static R fail(String message) {
R r = new R();
r.setCode(500);
r.setMessage(message);
return r;
}
}
postman
相应参数:
{
"timestamp": "2019-09-14T15:17:25.919+0000",
"status": 400,
"error": "Bad Request",
"errors": [
{
"codes": [
"Range.validationModel.age",
"Range.age",
"Range.java.lang.String",
"Range"
],
"arguments": [
{
"codes": [
"validationModel.age",
"age"
],
"arguments": null,
"defaultMessage": "age",
"code": "age"
},
60,
18
],
"defaultMessage": "年龄必须在 18 ⾄ 60 之间",
"objectName": "validationModel",
"field": "age",
"rejectedValue": "10",
"bindingFailure": false,
"code": "Range"
}
],
"message": "Validation failed for object='validationModel'. Error count: 1",
"path": "/index/save"
}
实现全局统⼀返回参数:
Spring MVC 在 org.springframework.web.hod.annotation.ResponseEntityExceptionHandler类已经进⾏了异常拦截,我们只需要到相应的处理⽅法,重写就可以了

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。