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小时内删除。
发表评论