从if-else的参数校验中解放出来
程序员文章站
2022-04-30 09:25:10
...
官方文档
-
hibernate validator
(官方文档)提供了一套比较完善、便捷的验证实现方式。它定义了很多常用的校验注解,我们可以直接将这些注解加在我们JavaBean
的属性上面,就可以在需要校验的时候进行校验了。在Spring Boot
火热的现在,该工具已经包含在spring-boot-starter-web
中,不需额外引入其他包。
使用
在DTO中声明要检查的参数
- 常见的检验注解
- @Null:被注释的元素必须为 null
- @NotNull:被注释的元素必须不为 null
- @AssertTrue
:被注释的元素必须为
true - @AssertFalse
:被注释的元素必须为
[email protected](value):被注释的元素必须是一个数字,其值必须大于等于指定的最小值 - @Max(value):被注释的元素必须是一个数字,其值必须小于等于指定的最大值
- @DecimalMin(value):被注释的元素必须是一个数字,其值必须大于等于指定的最小值
- @DecimalMax(value):被注释的元素必须是一个数字,其值必须小于等于指定的最大值
- @Size(max=, min=):被注释的元素的大小必须在指定的范围内
- @Digits (integer, fraction):被注释的元素必须是一个数字,其值必须在可接受的范围内
- @Past:被注释的元素必须是一个过去的日期
- @Future:被注释的元素必须是一个将来的日期
- @Pattern(regex=,flag=):被注释的元素必须符合指定的正则表达式
- @NotBlank(message =):验证字符串非null,且长度必须大于0
- @Email:被注释的元素必须是电子邮箱地址
- @Length(min=,max=):被注释的字符串的大小必须在指定的范围内
- @NotEmpty:被注释的字符串的必须非空
- @Range(min=,max=,message=):被注释的元素必须在合适的范围内
接口处声明要检查的参数
-
需要在Controller层的入参位置用
@Validated
注解声明public HttpResult test(@Validated UserDTO userDTO)
Web全局异常捕获
- @Valid在Spring boot中进行绑定参数检验时会抛出异常,需要在Spring Boot中处理
自定义注解校验
分组校验
在不同情况下需要检验的信息不同
定义分组接口
Create.java
import javax.validation.groups.Default;
public interface Create extends Default {
}
Update.java
import javax.validation.groups.Default;
public interface Update extends Default {
}
在DTO需要校验的字段添加声明
@NotNull(message = "id 不能为空", groups = Update.class)
private Long userId;
控制层入参位置进行声明
@RestController
@RequestMapping("/groups")
public class ValidatorGroupsController {
@PostMapping("/update")
public HttpResult updateData(@Validated(Update.class)UserDTO userDTO) {
return HttpResult.success(userDTO);
}
@PostMapping("/create")
public HttpResult createData(@Validated(Create.class)UserDTO userDTO) {
return HttpResult.success(userDTO);
}
}
@Validate和Valid的区别及使用
概述
@Valid是使用Hibernate validation的时候使用
@Validated是只用Spring Validator校验机制使用
@Validation对@Valid进行了二次封装,在使用上并没有区别,但在分组、注解位置、嵌套验证等功能上有所不同,这里主要就这几种情况进行说明。
注解位置
@Validated:用在类型、方法和方法参数上。但不能用于成员属性(field)
@Valid:可以用在方法、构造函数、方法参数和成员属性(field)上
分组校验
@Validated:提供分组功能,可以在参数验证时,根据不同的分组采用不同的验证机制
@Valid:没有分组功能
> * 不分配groups时默认每次都要验证
>
> * 对一个参数需要多种验证方式时,也可通过分配不同的组达到目的。
组序列
默认情况下不同级别的约束验证是无序的,但是在一些情况下,顺序验证很重要
一个组可以定义为其他组的序列,使用它进行验证的时候必须符合该序列规定的顺序。在使用组序列验证的时候,如果序列前边的组验证失败,则后面的组将不再给予验证。
嵌套校验
- 一个待验证的pojo类,其中还包含了待验证的对象,需要在待验证对象上注解@Valid,才能验证待验证对象中的成员属性,这里不能使用@Validated。
上一篇: grafana配置邮件发送
下一篇: ssh常见用法