第二十九章 SpringBoot项目使用Validator参数校验

亮子 2024-10-28 02:08:18 298 0 0 0

一、使用流程

在Spring Boot项目中,可以使用@Valid@Validated注解配合Java Bean Validation API(如Hibernate Validator)来进行参数校验。以下是一个简单的示例,展示如何在控制器中使用这些注解进行参数校验。

步骤1:添加依赖

确保在pom.xml中添加了相关的依赖(如果使用Maven):

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

步骤2:创建一个DTO类

创建一个用于接收请求参数的DTO(数据传输对象)类,并使用JSR-303注解进行字段校验:

import javax.validation.constraints.Email;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.Size;

public class UserDto {

    @NotBlank(message = "用户名不能为空")
    private String username;

    @Email(message = "邮箱格式不正确")
    private String email;

    @Size(min = 6, message = "密码至少需要6个字符")
    private String password;

    // getters and setters
}

步骤3:在控制器中使用校验

在你的控制器中,使用@Valid注解来标识需要校验的参数,并通过@RequestBody接收JSON格式的请求体:

import org.springframework.http.ResponseEntity;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;

import javax.validation.Valid;

@RestController
@RequestMapping("/users")
@Validated
public class UserController {

    @PostMapping
    public ResponseEntity<String> createUser(@Valid @RequestBody UserDto userDto) {
        // 处理用户创建逻辑
        return ResponseEntity.ok("用户创建成功");
    }
}

步骤4:处理校验异常

可以定义一个全局异常处理器,来处理校验失败的情况:

import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.MethodArgumentNotValidException;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;

import java.util.HashMap;
import java.util.Map;

@ControllerAdvice
public class GlobalExceptionHandler {

    @ExceptionHandler(MethodArgumentNotValidException.class)
    public ResponseEntity<Map<String, String>> handleValidationExceptions(MethodArgumentNotValidException ex) {
        Map<String, String> errors = new HashMap<>();
        ex.getBindingResult().getFieldErrors().forEach(error ->
            errors.put(error.getField(), error.getDefaultMessage())
        );
        return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(errors);
    }
}

总结

以上步骤展示了如何在Spring Boot项目中使用@Valid注解进行参数校验。你可以根据具体的需求添加更多的校验规则,确保输入数据的有效性。

二、validation的参数校验的注解

Java Bean Validation API 提供了一系列注解,用于对对象属性进行参数校验。以下是一些常用的校验注解及其作用:

1. @NotNull

  • 作用: 验证值不能为null
  • 示例:
  @NotNull(message = "姓名不能为空")
  private String name;

2. @NotBlank

  • 作用: 验证字符串不能为null且不能为空字符串(去掉空格后)。
  • 示例:
  @NotBlank(message = "用户名不能为空")
  private String username;

3. @NotEmpty

  • 作用: 验证集合、数组或字符串不能为空。
  • 示例:
  @NotEmpty(message = "邮箱列表不能为空")
  private List<String> emails;

4. @Size

  • 作用: 验证字符串的长度、数组或集合的大小。
  • 示例:
  @Size(min = 6, max = 20, message = "密码长度必须在6到20之间")
  private String password;

5. @Min@Max

  • 作用: 验证数字的最小值和最大值。
  • 示例:
  @Min(value = 18, message = "年龄必须大于等于18")
  @Max(value = 99, message = "年龄必须小于等于99")
  private int age;

6. @Email

  • 作用: 验证字符串是否符合邮箱格式。
  • 示例:
  @Email(message = "邮箱格式不正确")
  private String email;

7. @Pattern

  • 作用: 使用正则表达式验证字符串。
  • 示例:
  @Pattern(regexp = "^[A-Za-z0-9]+$", message = "用户名只能包含字母和数字")
  private String username;

8. @Future@Past

  • 作用: 验证日期必须在当前时间之后或之前。
  • 示例:
  @Future(message = "截止日期必须在未来")
  private LocalDate deadline;
  
  @Past(message = "出生日期必须在过去")
  private LocalDate birthDate;

9. @Valid

  • 作用: 递归验证嵌套对象。
  • 示例:
  @Valid
  private Address address;

10. @AssertTrue@AssertFalse

  • 作用: 验证布尔值是否为truefalse
  • 示例:
  @AssertTrue(message = "必须接受条款和条件")
  private boolean acceptedTerms;

小结

这些注解可以组合使用,以实现更复杂的校验逻辑。在实际项目中,根据业务需求选择合适的校验注解,确保数据的有效性和安全性。