微信登录

数据验证 - JSR 303 验证 - 使用注解验证数据

Java Web Spring:数据验证 - JSR 303 验证 - 使用注解验证数据

在 Java Web 开发中,数据验证是一项至关重要的任务。它可以确保用户输入的数据符合我们预先设定的规则,从而提高系统的健壮性和安全性。JSR 303 是 Java 为数据验证定义的标准规范,Spring 框架对其提供了良好的支持,允许我们使用注解的方式来轻松地进行数据验证。本文将详细介绍如何在 Spring 项目中使用 JSR 303 注解进行数据验证。

什么是 JSR 303

JSR 303(Java Specification Request 303)是 Java 社区为 Java Bean 验证定义的一个标准规范,也称为 Bean Validation。它通过在 Java Bean 的属性上添加注解,来定义该属性需要满足的约束条件。例如,我们可以指定一个属性必须不为空、长度必须在某个范围内等。Hibernate Validator 是 JSR 303 的一个参考实现,Spring 框架默认集成了 Hibernate Validator。

常用的 JSR 303 注解

注解 描述
@NotNull 验证元素不能为 null
@NotEmpty 验证元素不为 null 且长度大于 0,可用于字符串、集合、数组等
@NotBlank 验证字符串不为 null 且去除首尾空格后长度大于 0
@Size(min =, max =) 验证元素的大小必须在指定的范围内,可用于字符串、集合、数组等
@Min(value =) 验证数字(包括整数、浮点数等)必须大于等于指定的值
@Max(value =) 验证数字必须小于等于指定的值
@Email 验证字符串是一个有效的电子邮件地址

演示项目搭建

1. 创建 Spring Boot 项目

我们可以使用 Spring Initializr(https://start.spring.io/)来创建一个新的 Spring Boot 项目,添加以下依赖:

  • Spring Web
  • Validation

2. 定义实体类

创建一个简单的用户实体类 User,并在其属性上添加 JSR 303 注解:

  1. import javax.validation.constraints.Email;
  2. import javax.validation.constraints.NotBlank;
  3. import javax.validation.constraints.NotNull;
  4. import javax.validation.constraints.Size;
  5. public class User {
  6. @NotNull(message = "用户 ID 不能为空")
  7. private Long id;
  8. @NotBlank(message = "用户名不能为空")
  9. @Size(min = 2, max = 20, message = "用户名长度必须在 2 到 20 之间")
  10. private String username;
  11. @Email(message = "邮箱格式不正确")
  12. @NotBlank(message = "邮箱不能为空")
  13. private String email;
  14. // 构造函数、Getter 和 Setter 方法
  15. public User() {}
  16. public User(Long id, String username, String email) {
  17. this.id = id;
  18. this.username = username;
  19. this.email = email;
  20. }
  21. public Long getId() {
  22. return id;
  23. }
  24. public void setId(Long id) {
  25. this.id = id;
  26. }
  27. public String getUsername() {
  28. return username;
  29. }
  30. public void setUsername(String username) {
  31. this.username = username;
  32. }
  33. public String getEmail() {
  34. return email;
  35. }
  36. public void setEmail(String email) {
  37. this.email = email;
  38. }
  39. }

3. 创建控制器

创建一个 UserController 来处理用户相关的请求,并使用 @Valid 注解来触发数据验证:

  1. import org.springframework.http.HttpStatus;
  2. import org.springframework.http.ResponseEntity;
  3. import org.springframework.validation.BindingResult;
  4. import org.springframework.validation.FieldError;
  5. import org.springframework.web.bind.annotation.PostMapping;
  6. import org.springframework.web.bind.annotation.RequestBody;
  7. import org.springframework.web.bind.annotation.RestController;
  8. import javax.validation.Valid;
  9. import java.util.HashMap;
  10. import java.util.Map;
  11. @RestController
  12. public class UserController {
  13. @PostMapping("/users")
  14. public ResponseEntity<?> createUser(@Valid @RequestBody User user, BindingResult bindingResult) {
  15. if (bindingResult.hasErrors()) {
  16. Map<String, String> errors = new HashMap<>();
  17. for (FieldError error : bindingResult.getFieldErrors()) {
  18. errors.put(error.getField(), error.getDefaultMessage());
  19. }
  20. return new ResponseEntity<>(errors, HttpStatus.BAD_REQUEST);
  21. }
  22. // 模拟保存用户信息
  23. return new ResponseEntity<>("用户创建成功", HttpStatus.CREATED);
  24. }
  25. }

4. 测试验证功能

我们可以使用 Postman 或其他工具来测试 POST /users 接口。以下是一个测试用例:

  1. {
  2. "id": null,
  3. "username": "a",
  4. "email": "invalidemail"
  5. }

发送该请求后,服务器将返回一个包含验证错误信息的响应:

  1. {
  2. "id": "用户 ID 不能为空",
  3. "username": "用户名长度必须在 2 到 20 之间",
  4. "email": "邮箱格式不正确"
  5. }

总结

通过使用 JSR 303 注解,我们可以在 Spring 项目中轻松地实现数据验证功能。只需要在实体类的属性上添加相应的注解,然后在控制器方法的参数上使用 @Valid 注解触发验证,就可以确保用户输入的数据符合我们的要求。这种方式不仅提高了开发效率,还使代码更加简洁和易于维护。

希望本文能帮助你理解和掌握在 Spring 项目中使用 JSR 303 注解进行数据验证的方法。如果你有任何疑问或建议,欢迎留言讨论。