Validation 官网
常见注解
Bean Validation中定义的注解:
注解 | 详细信息 |
---|---|
@Null | 被注释的元素必须为 null |
@NotNull | 被注释的元素必须不为 null |
@AssertTrue | 被注释的元素必须为 true |
@AssertFalse | 被注释的元素必须为 false |
@Min(value) | 被注释的元素必须是一个数字,其值必须大于等于指定的最小值 |
@Max(value) | 被注释的元素必须是一个数字,其值必须小于等于指定的最大值 |
@DecimalMin(value) | 被注释的元素必须是一个数字,其值必须大于等于指定的最小值 |
@DecimalMax(value) | 被注释的元素必须是一个数字,其值必须小于等于指定的最大值 |
@Size(max, min) | 被注释的元素的大小必须在指定的范围内 |
@Digits (integer, fraction) | 被注释的元素必须是一个数字,其值必须在可接受的范围内 |
@Past | 被注释的元素必须是一个过去的日期 |
@Future | 被注释的元素必须是一个将来的日期 |
@Pattern(value) | 被注释的元素必须符合指定的正则表达式 |
Hibernate validator 在JSR303的基础上对校验注解进行了扩展,扩展注解如下:
注解 | 详细信息 |
---|---|
被注释的元素必须是电子邮箱地址 | |
@Length | 被注释的字符串的大小必须在指定的范围内 |
@NotEmpty | 被注释的字符串的必须非空 |
@Range | 被注释的元素必须在合适的范围内 |
导包
您需要在 pom.xml 文件中添加以下依赖项
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-validationartifactId>
dependency>
实体类
您还需要使用验证注解来定义实体类。例如:
@Data
@AllArgsConstructor
@NoArgsConstructor
public class User {
private String name;
private Integer age;
private String email;
}
DTO 类
然后创建一个相应的 DTO 类,并在其中使用验证注解,比如 UserDTO:
@Data
@AllArgsConstructor
@NoArgsConstructor
public class UserDTO {
@NotBlank(message = "name不能为空或者空格")
@Size(min=3, max=9,message = "长度在3-9之间")
private String name;
@NotNull(message = "age不能为空")
@Max(value=60,message = "年龄最大60")
@Min(value=18,message = "年龄最小18")
private Integer age;
@NotNull
@Email(message = "邮箱格式不正确")
private String email;
}
Controller控制器
在控制器中,您可以使用 @Validated 注解为请求体启用验证。例如:
@RestController
public class UserController {
@PostMapping("/add")
public String add(@Validated @RequestBody UserDTO userDTO) {
User user = new User();
BeanUtils.copyProperties(userDTO, user);
return "注册成功";
}
}
全局异常配置类
要全局处理验证错误,您可以使用 @RestControllerAdvice 和 @ExceptionHandler 注解创建一个全局异常处理器。例如:
@RestControllerAdvice
@Component
public class GlobalExceptionHandler {
@ExceptionHandler(MethodArgumentNotValidException.class)
public Object handleMethodArgumentNotValidException(MethodArgumentNotValidException e) {
// 获取异常信息
BindingResult bindingResult = e.getBindingResult();
List<ObjectError> allErrors = bindingResult.getAllErrors();
// 构建返回结果
Map<String, Object> result = new LinkedHashMap<>();
result.put("code", "400");
result.put("message", "参数校验失败");
Map<String, Object> errors = new LinkedHashMap<>();
allErrors.forEach(error -> errors.put(((FieldError) error).getField(), error.getDefaultMessage()));
result.put("errors", errors);
return result;
}
}
启动类
用来启动web项目
@SpringBootApplication
public class ValidationApplication {
public static void main(String[] args) {
SpringApplication.run(ValidationApplication.class, args);
}
}
启动项目
postman测试
用户名不合法
{
"name":"",
"age":20,
"email":"奇遇少年@163.com"
}
年龄不合法
{
"name":"奇遇少年",
"age":10,
"email":"奇遇少年@163.com"
}
邮箱格式不合法
{
"name":"奇遇少年",
"age":20,
"email":"奇遇少年"
}
数据正确,注册成功
{
"name":"奇遇少年",
"age":20,
"email":"奇遇少年@163.com"
}