Spring Boot手动调用Validator实现

介绍

在使用Spring Boot进行开发时,经常需要对请求参数进行校验,保证数据的有效性和一致性。Spring Boot提供了Validator接口和相关注解,可以方便地实现参数校验。本文将教会你如何在Spring Boot中手动调用Validator进行参数校验。

流程概述

下面是整个流程的步骤概述,详细的步骤将在后面进行展开说明。

journey
    title Spring Boot手动调用Validator实现流程

    section 1. 准备工作
        Step 1: 创建Spring Boot项目
        Step 2: 添加依赖

    section 2. 创建DTO类
        Step 3: 创建DTO类
        Step 4: 添加校验注解

    section 3. 创建自定义Validator
        Step 5: 创建自定义Validator类
        Step 6: 实现校验逻辑

    section 4. 手动调用Validator
        Step 7: 注入Validator
        Step 8: 调用Validator校验

    section 5. 测试
        Step 9: 编写测试用例
        Step 10: 运行测试用例

    section 6. 总结
        Step 11: 总结

准备工作

Step 1: 创建Spring Boot项目

首先,使用IDE工具(如IntelliJ IDEA)创建一个新的Spring Boot项目。

Step 2: 添加依赖

pom.xml文件中添加Spring Boot Web和Validation的依赖:

<dependencies>
    <!-- Spring Boot Web -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>

    <!-- Validation -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-validation</artifactId>
    </dependency>
</dependencies>

创建DTO类

Step 3: 创建DTO类

创建一个DTO(数据传输对象)类,用于接收请求参数。例如,我们创建一个名为UserDTO的类:

public class UserDTO {
    private String username;
    private String password;

    // getters and setters
}

Step 4: 添加校验注解

在DTO类的字段上使用校验注解,以定义参数校验规则。例如,我们为username字段添加@NotBlank注解,表示该字段不能为空:

public class UserDTO {
    @NotBlank(message = "Username cannot be blank")
    private String username;
    private String password;

    // getters and setters
}

创建自定义Validator

Step 5: 创建自定义Validator类

创建一个自定义的Validator类,用于实现参数校验的逻辑。例如,我们创建一个名为UserValidator的类:

@Component
public class UserValidator implements Validator {

    @Override
    public boolean supports(Class<?> clazz) {
        return UserDTO.class.equals(clazz);
    }

    @Override
    public void validate(Object target, Errors errors) {
        // 校验逻辑
    }
}

Step 6: 实现校验逻辑

validate方法中,我们可以编写校验逻辑。可以使用errors对象来添加校验错误信息。例如,我们实现一个简单的校验逻辑,要求密码不能小于6位:

@Override
public void validate(Object target, Errors errors) {
    UserDTO userDTO = (UserDTO) target;
    if (userDTO.getPassword().length() < 6) {
        errors.rejectValue("password", "Password length must be at least 6");
    }
}

手动调用Validator

Step 7: 注入Validator

在需要调用Validator的地方注入它。例如,我们可以在Controller类中注入UserValidator

@RestController
public class UserController {

    private final Validator validator;

    public UserController(Validator validator) {
        this.validator = validator;
    }

    // ...
}

Step 8: 调用Validator校验

在需要进行参数校验的方法中,我们可以调用Validator的validate方法进行校验。例如,我们在Controller的某个接口方法中进行校验:

@PostMapping("/users")
public ResponseEntity<?> createUser(@RequestBody UserDTO userDTO) {
    // 手动调用Validator进行参数校验
    Set<ConstraintViolation<UserDTO>> violations = validator.validate