Jakarta Bean Validation

Validation 官网

https://beanvalidation.org/

常见注解

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的基础上对校验注解进行了扩展,扩展注解如下:

注解 详细信息
@Email 被注释的元素必须是电子邮箱地址
@Length 被注释的字符串的大小必须在指定的范围内
@NotEmpty 被注释的字符串的必须非空
@Range 被注释的元素必须在合适的范围内

导包

您需要在 pom.xml 文件中添加以下依赖项

xml 复制代码
<dependency>
   <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-validation</artifactId>
</dependency>

实体类

您还需要使用验证注解来定义实体类。例如:

java 复制代码
@Data
@AllArgsConstructor
@NoArgsConstructor
public class User {
    private String name;
    private Integer age;
    private String email;
}

DTO 类

然后创建一个相应的 DTO 类,并在其中使用验证注解,比如 UserDTO:

java 复制代码
@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 注解为请求体启用验证。例如:

java 复制代码
@RestController
public class UserController {
    @PostMapping("/add")
    public String add(@Validated @RequestBody UserDTO userDTO) {
        User user = new User();
        BeanUtils.copyProperties(userDTO, user);
        return "注册成功";
    }
}

全局异常配置类

要全局处理验证错误,您可以使用 @RestControllerAdvice 和 @ExceptionHandler 注解创建一个全局异常处理器。例如:

java 复制代码
@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项目

java 复制代码
@SpringBootApplication
public class ValidationApplication {
    public static void main(String[] args) {
        SpringApplication.run(ValidationApplication.class, args);
    }
}

启动项目

postman测试

用户名不合法

json 复制代码
{   
    "name":"",
    "age":20,
    "email":"奇遇少年@163.com"
}

年龄不合法

json 复制代码
{   
    "name":"奇遇少年",
    "age":10,
    "email":"奇遇少年@163.com"
}

邮箱格式不合法

json 复制代码
{   
    "name":"奇遇少年",
    "age":20,
    "email":"奇遇少年"
}

数据正确,注册成功

json 复制代码
{   
    "name":"奇遇少年",
    "age":20,
    "email":"奇遇少年@163.com"
}
相关推荐
零千叶1 小时前
【面试】AI大模型应用原理面试题
java·设计模式·面试
坐吃山猪5 小时前
SpringBoot01-配置文件
java·开发语言
我叫汪枫6 小时前
《Java餐厅的待客之道:BIO, NIO, AIO三种服务模式的进化》
java·开发语言·nio
yaoxtao6 小时前
java.nio.file.InvalidPathException异常
java·linux·ubuntu
Swift社区7 小时前
从 JDK 1.8 切换到 JDK 21 时遇到 NoProviderFoundException 该如何解决?
java·开发语言
DKPT8 小时前
JVM中如何调优新生代和老生代?
java·jvm·笔记·学习·spring
phltxy8 小时前
JVM——Java虚拟机学习
java·jvm·学习
seabirdssss10 小时前
使用Spring Boot DevTools快速重启功能
java·spring boot·后端
喂完待续10 小时前
【序列晋升】29 Spring Cloud Task 微服务架构下的轻量级任务调度框架
java·spring·spring cloud·云原生·架构·big data·序列晋升