Spring Boot 中的验证


数据验证是任何应用程序开发的关键组成部分。它确保只有符合预定义标准的高质量数据才能被处理。Spring Boot是Java生态系统中著名的框架,它提供了强大而直接的验证方法,开发人员可以利用这些方法。本文全面介绍了如何在Spring Boot应用程序中进行验证,使您可以有效地实现这些基本技术。

Spring Boot 中数据验证的重要性

在 Spring Boot 中,与任何应用程序一样,数据验证至关重要。它涉及在处理数据之前确保接收到的数据符合某些条件。验证检查的示例包括验证字段是否未留空、电子邮件格式是否正确或数字是否在特定范围内。

Spring Boot 利用 Java Bean Validation 规范(也称为 JSR 380)及其参考实现 Hibernate Validator 提供的注解来简化数据验证过程。

在 Spring Boot 中设置验证

为了启动此过程,Spring Boot 的启动器依赖项使将 Bean Validation API 及其 Hibernate Validator 实现集成到您的项目中变得更加容易。通过将 spring-boot-starter-web 依赖项添加到您的构建配置文件中,Hibernate Validator 会被隐式包含。

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

有了这个,我们就可以开始在 Spring Boot 应用程序中实现数据验证了。

实现 Bean Validation API

Bean Validation API 提供了一系列用于对象属性验证的注解。这些注解可以应用于您的 Java Bean 字段或 getter 方法。这是一个示例:

public class User {
   @NotNull
   @Size(min = 2, max = 30)
   private String name;
   @NotNull
   @Email
   private String email;
   // getters and setters
}

在这个 User 类中,我们使用 @NotNull、@Size 和 @Email 注解来定义 name 和 email 字段的验证规则。

在控制器中应用验证

要激活这些验证,控制器方法中的对象参数应该用 @Valid 注解。如果对象无效,则会引发异常。以下是它的工作原理:

@PostMapping("/users")
public ResponseEntity<String> addUser(@Valid @RequestBody User user) {
   // method logic
}

在这种情况下,@Valid 注解触发 User 对象的验证。如果任何验证规则被违反,则会引发 MethodArgumentNotValidException 异常。

定制错误消息

可以将自定义错误消息直接添加到 Bean Validation 注解中,以获得更个性化的体验:

public class User {
   @NotNull(message = "Name cannot be null")
   @Size(min = 2, max = 30, message = "Name must be between 2 and 30 characters")
   private String name;
   @NotNull(message = "Email cannot be null")
   @Email(message = "Email should be valid")
   private String email;
   // getters and setters
}

处理验证异常

Spring Boot 还提供了一种通过 @ControllerAdvice 注解在全局级别处理异常的方法。您可以创建一个类来处理 MethodArgumentNotValidException 并返回自定义响应:

@ControllerAdvice
public class GlobalExceptionHandler {
   @ExceptionHandler(MethodArgumentNotValidException.class)
   public ResponseEntity<List<String>handleValidationExceptions(MethodArgumentNotValidException ex) {
   List<String> errors = ex.getBindingResult()
      .getAllErrors().stream()
      .map(ObjectError::getDefaultMessage
      .collect(Collectors.toList());
   return new ResponseEntity<>(errors, HttpStatus.BAD_REQUEST);
   }
}

在这个 GlobalExceptionHandler 类中,handleValidationExceptions 方法用 @ExceptionHandler 注解,指定在抛出 MethodArgumentNotValidException 时应调用它。此方法从异常中获取所有错误并将它们收集到一个列表中,然后在响应实体中以 BAD_REQUEST 状态返回该列表。

高级验证:创建自定义注解

Spring Boot 还提供了创建自定义验证注解的灵活性。此功能允许开发人员编写标准 Bean Validation 约束未涵盖的特定规则。

例如,如果您想验证字符串是否不包含任何数字字符,您可以创建一个 NoNumbers 约束注解和一个关联的验证器类。

@Target({ ElementType.FIELD, ElementType.METHOD })
@Retention(RetentionPolicy.RUNTIME)
@Constraint(validatedBy = NoNumbersValidator.class)
public @interface NoNumbers {
   String message() default "Field should not contain numeric characters";
   Class<>[] groups() default { };
   Class< extends Payload>[] payload() default { };
}

然后在您的验证器类中实现 ConstraintValidator 接口:

public class NoNumbersValidator implements ConstraintValidator {
   @Override
   public boolean isValid(String value, ConstraintValidatorContext context) {
      return value != null && !value.matches(".*\d.*");
   }
}

结论

Spring Boot 中的数据验证提供了一种确保应用程序数据可靠性和质量的基本机制。使用 Bean Validation API 和 Hibernate Validator,您可以轻松实现和自定义验证规则。此外,通过了解如何处理异常和创建自定义验证规则,您可以为 Spring Boot 应用程序建立一个强大而灵活的验证系统。

更新于:2023年7月19日

2K+ 浏览量

开启您的 职业生涯

通过完成课程获得认证

开始学习
广告