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"
}
相关推荐
Grey Zeng5 小时前
Java SE 25新增特性
java·jdk·jdk新特性·jdk25
雨白6 小时前
Java 线程通信基础:interrupt、wait 和 notifyAll 详解
android·java
架构师沉默10 小时前
设计多租户 SaaS 系统,如何做到数据隔离 & 资源配额?
java·后端·架构
Java中文社群12 小时前
重要:Java25正式发布(长期支持版)!
java·后端·面试
每天进步一点_JL13 小时前
JVM 类加载:双亲委派机制
java·后端
用户2986985301413 小时前
Java HTML 转 Word 完整指南
java·后端
渣哥13 小时前
原来公平锁和非公平锁差别这么大
java
渣哥14 小时前
99% 的人没搞懂:Semaphore 到底是干啥的?
java
J2K14 小时前
JDK都25了,你还没用过ZGC?那真得补补课了
java·jvm·后端
kfyty72514 小时前
不依赖第三方,不销毁重建,loveqq 框架如何原生实现动态线程池?
java·架构