SpringMVC 使用JSR-303进行校验 @Valid示例

下面是 SpringMVC 使用 JSR-303 进行校验的完整攻略:

下面是 SpringMVC 使用 JSR-303 进行校验的完整攻略:

1. 添加依赖

在 pom.xml 添加如下依赖:

<dependency>
  <groupId>org.springframework</groupId>
  <artifactId>spring-context</artifactId>
  <version>5.2.5.RELEASE</version>
</dependency>

<dependency>
  <groupId>org.springframework</groupId>
  <artifactId>spring-webmvc</artifactId>
  <version>5.2.5.RELEASE</version>
</dependency>

<dependency>
  <groupId>org.hibernate.validator</groupId>
  <artifactId>hibernate-validator</artifactId>
  <version>6.0.17.Final</version>
</dependency>

2. 创建验证规则

使用 JSR-303 注解定义验证规则,例如下面的代码:

public class User {
  @NotNull(message = "姓名不能为空")
  private String name;

  @Pattern(regexp = "^1[3-9]\\d{9}$", message = "手机号格式不正确")
  private String phone;

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

  // 省略 getter 和 setter
}

这段代码定义了一个 User 类,其中有 namephoneemail 三个字段,使用了 @NotNull@Pattern@Email 注解分别对这三个字段进行了校验。

3. 编写控制器

在控制器方法中使用 @Valid 注解校验请求参数,例如下面的代码:

@RestController
public class UserController {
  @PostMapping("/users")
  public String addUser(@Valid @RequestBody User user, BindingResult bindingResult) {
    if (bindingResult.hasErrors()) {
      return bindingResult.getFieldError().getDefaultMessage();
    }
    // 执行添加用户的逻辑
    return "success";
  }
}

这段代码中,@Valid 注解用于校验请求参数中的 User 对象,如果有校验错误,会将错误信息放入 BindingResult 对象中。如果校验成功,则执行添加用户的逻辑。

4. 测试

我们使用 Postman 发送一条 POST 请求,请求的 body 内容为:

{
  "name": null,
  "phone": "12345678900",
  "email": "example.com"
}

根据我们之前定义的校验规则,name 字段不能为空,phone 字段必须是手机号格式,email 字段必须是邮箱格式。因此这个请求会校验失败,返回如下错误信息:

姓名不能为空

5. 示例二

为了更好地说明 SpringMVC 使用 JSR-303 进行校验 @Valid 的使用方法,这里提供另外一条示例:

@RestController
public class UserController {
  @PostMapping("/users")
  public String addUser(@Valid UserInfo userInfo, BindingResult bindingResult) {
    if (bindingResult.hasErrors()) {
      return bindingResult.getFieldError().getDefaultMessage();
    }
    return "success";
  }
}

public class UserInfo {
  @NotNull(message = "username 不能为空")
  private String username;

  @NotNull(message = "age 不能为空")
  private Integer age;

  @Max(value = 10, message = "score 不得超过 10")
  @Min(value = 0, message = "score 不得低于 0")
  private Integer score;

  public String getUsername() {
    return username;
  }

  public void setUsername(String username) {
    this.username = username;
  }

  public Integer getAge() {
    return age;
  }

  public void setAge(Integer age) {
    this.age = age;
  }

  public Integer getScore() {
    return score;
  }

  public void setScore(Integer score) {
    this.score = score;
  }
}

这个示例和之前的示例非常相似,只不过这里使用的是 UserInfo 类而不是 User 类。注意,这里没有使用 @RequestBody 注解,因此直接使用 UserInfo 类即可,而不需要使用 @RequestBody UserInfo

我们发起一条 POST 请求,请求的 body 内容为:

{
  "username": null,
  "age": 20,
  "score": 11
}

这个请求会校验失败,返回如下错误信息:

username 不能为空
score 不得超过 10

这里的校验规则也非常明显,在 UserInfo 类中,username 字段不能为空,age 字段不能为空整数,score 字段必须在 0 和 10 之间。如果有任意一个校验失败,会返回对应的错误信息。

以上就是 SpringMVC 使用 JSR-303 进行校验 @Valid 的完整攻略。

本文标题为:SpringMVC 使用JSR-303进行校验 @Valid示例

基础教程推荐