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"
}
相关推荐
七禾页话5 分钟前
Java并发常见面试题(上)
java·jvm
Aries26315 分钟前
Spring事务传播行为详解
java·数据库·spring
陌上少年,且听这风吟22 分钟前
【已解决】SpringBoot3项目整合Druid依赖:Druid监控页面404报错
java·spring boot·spring
洗发水很好用30 分钟前
新版IDEA提示@Autowired不建议字段注入
java·ide·intellij-idea
model200532 分钟前
sahi目标检测java实现
java·算法·目标检测
LG.YDX1 小时前
java:练习
java
给自己做减法1 小时前
排序算法快速记忆
java·算法·排序算法
计算机学姐1 小时前
基于微信小程序的食堂点餐预约管理系统
java·vue.js·spring boot·mysql·微信小程序·小程序·mybatis
骆晨学长2 小时前
基于springboot学生健康管理系统的设计与实现
java·开发语言·spring boot·后端·spring
骆晨学长2 小时前
基于Springboot的医疗健康助手开题报告
java·spring boot·后端