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"
}
相关推荐
Terio_my1 分钟前
简要 Java 面试题学习
java·开发语言·学习
好好研究28 分钟前
Spring Boot - Thymeleaf模板引擎
java·spring boot·后端·thymeleaf
爬山算法30 分钟前
Hibernate(76)如何在混合持久化环境中使用Hibernate?
java·后端·hibernate
编程彩机32 分钟前
互联网大厂Java面试:从分布式缓存到消息队列的技术场景解析
java·redis·面试·kafka·消息队列·微服务架构·分布式缓存
她说..36 分钟前
策略模式+工厂模式实现单接口适配多审核节点
java·spring boot·后端·spring·简单工厂模式·策略模式
坚持就完事了1 小时前
Java的OOP
java·开发语言
像少年啦飞驰点、1 小时前
零基础入门 Spring Boot:从“Hello World”到可部署微服务的完整学习路径
java·spring boot·微服务·编程入门·后端开发
undsky_1 小时前
【RuoYi-SpringBoot3-Pro】:将 AI 编程融入传统 java 开发
java·人工智能·spring boot·ai·ai编程
不光头强1 小时前
shiro学习要点
java·学习·spring
工一木子1 小时前
Java 的前世今生:从 Oak 到现代企业级语言
java·开发语言