在 Spring Boot 中,数据校验是开发过程中重要的一环,它可以帮助您在用户输入数据之前进行验证,以确保数据的有效性和完整性。使用 Spring Boot 提供的数据校验功能,您可以轻松地在控制器层对输入数据进行验证,避免无效或不合法的数据进入系统。本文将详细介绍在 Spring Boot 中如何进行数据校验。

1. 使用 JSR 303 标准注解

Spring Boot 基于 JSR 303 标准提供了数据校验的功能,您可以在实体类的属性上使用注解进行校验。常用的校验注解包括:

  • @NotNull:值不能为 null。
  • @NotBlank:字符串不能为 null、空字符串或只包含空白字符。
  • @NotEmpty:集合、数组或字符串不能为 null 或空。
  • @Min:值必须大于等于指定值。
  • @Max:值必须小于等于指定值。
  • @Size:集合、数组或字符串的大小必须在指定范围内。

2. 在控制器层进行数据校验

在控制器层,您可以使用 @Valid 注解将要校验的参数标记为需要验证。如果数据不合法,将会触发校验异常。

@RestController
public class UserController {

    @PostMapping("/users")
    public ResponseEntity<String> createUser(@Valid @RequestBody UserRequest userRequest) {
        // 处理用户创建逻辑
        return ResponseEntity.ok("User created successfully");
    }
}

3. 创建校验错误处理器

当数据校验失败时,Spring Boot 会抛出 MethodArgumentNotValidException 异常。您可以通过编写全局异常处理器来捕获并处理这些异常。

@ControllerAdvice
public class GlobalExceptionHandler {

    @ExceptionHandler(MethodArgumentNotValidException.class)
    public ResponseEntity<Map<String, String>> handleValidationException(MethodArgumentNotValidException ex) {
        Map<String, String> errors = new HashMap<>();
        ex.getBindingResult().getAllErrors().forEach((error) -> {
            String fieldName = ((FieldError) error).getField();
            String errorMessage = error.getDefaultMessage();
            errors.put(fieldName, errorMessage);
        });
        return ResponseEntity.badRequest().body(errors);
    }
}

4. 自定义校验注解

除了使用标准的校验注解,您还可以自定义校验注解,以适应特定的业务需求。

@Target({ ElementType.FIELD })
@Retention(RetentionPolicy.RUNTIME)
@Constraint(validatedBy = UniqueEmailValidator.class)
public @interface UniqueEmail {

    String message() default "Email already exists";

    Class<?>[] groups() default {};

    Class<? extends Payload>[] payload() default {};
}

5. 编写自定义校验逻辑

实现自定义校验注解所需的校验逻辑。

public class UniqueEmailValidator implements ConstraintValidator<UniqueEmail, String> {

    @Autowired
    private UserRepository userRepository;

    @Override
    public boolean isValid(String email, ConstraintValidatorContext context) {
        return !userRepository.existsByEmail(email);
    }
}

通过上述方法,您可以在 Spring Boot 中轻松地实现数据校验,确保输入数据的有效性和完整性。通过使用标准和自定义的校验注解,您可以在控制器层对用户输入进行验证,并通过全局异常处理器捕获和处理校验错误,从而保证系统的数据质量和安全性。