使用 Spring Boot 进行数据校验
以下是使用 Spring Boot 进行数据校验的步骤:
一、添加依赖
在 pom.xml
文件中添加 Spring Boot Starter Validation 依赖:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-validation</artifactId>
</dependency>
二、创建数据模型
创建一个数据模型类,并使用 JSR-303 注解进行数据校验,例如:
import javax.validation.constraints.Email;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.Size;
public class User {
@NotBlank(message = "用户名不能为空")
@Size(min = 3, max = 20, message = "用户名长度应在 3 到 20 之间")
private String username;
@NotBlank(message = "密码不能为空")
@Size(min = 6, max = 20, message = "密码长度应在 6 到 20 之间")
private String password;
@Email(message = "请输入有效的电子邮件地址")
private String email;
// 生成 getter 和 setter 方法
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
}
三、在控制器中使用校验
在控制器类中使用 @Valid
注解来启用对请求体中数据的校验,并使用 BindingResult
来处理校验结果,例如:
import org.springframework.validation.BindingResult;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RestController;
import javax.validation.Valid;
@RestController
public class UserController {
@PostMapping("/register")
public String registerUser(@Valid @RequestBody User user, BindingResult bindingResult) {
if (bindingResult.hasErrors()) {
return "输入信息有误: " + bindingResult.getAllErrors();
}
return "用户注册成功";
}
}
解释:
- 添加依赖:
spring-boot-starter-validation
依赖提供了 Spring Boot 中的数据校验支持,它包含了 JSR-303 验证 API 的实现,如 Hibernate Validator。
- 创建数据模型:
@NotBlank
注解确保字段不为空,包括不为null
和不包含仅空格的字符串。@Size
注解用于限制字段的长度范围,min
和max
属性分别指定最小和最大长度。@Email
注解确保字段包含有效的电子邮件地址。
- 在控制器中使用校验:
@Valid
注解放在@RequestBody
注解的对象之前,表示需要对该对象进行数据校验。BindingResult
用于存储校验结果。如果bindingResult.hasErrors()
为true
,表示有数据校验不通过,可通过bindingResult.getAllErrors()
获取错误信息。
这样,当你向 /register
发送一个 POST
请求时,如果请求体中的数据不满足 User
类中定义的校验规则,将返回相应的错误信息;如果数据校验通过,则会返回 “用户注册成功”。
请注意,在实际应用中,你可以根据具体业务需求添加更多的校验注解,如 @NotNull
、@Pattern
等,以确保数据的准确性和完整性。同时,对于校验结果的处理可以更加细化,比如将错误信息以更友好的形式返回给前端,而不是直接使用 bindingResult.getAllErrors()
的原始输出。
除了使用 Spring Boot 自带的 spring-boot-starter-validation
组件进行数据验证外,还有以下一些成熟的组件可以使用:
一、Hibernate Validator
Hibernate Validator 是 Bean Validation 的参考实现,它提供了丰富的注解和强大的验证功能。它支持 JSR 380(Bean Validation 2.0),可以很好地与 Spring Boot 集成。
添加依赖:
<dependency>
<groupId>org.hibernate.validator</groupId>
<artifactId>hibernate-validator</artifactId>
<version>6.2.0.Final</version>
</dependency>
使用示例:
与 Spring Boot 的 spring-boot-starter-validation
类似,使用 JSR-303 注解,如 @NotNull
, @Size
, @Email
等,在数据模型上添加注解进行验证。
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Size;
public class Person {
@NotNull
@Size(min = 2, max = 30)
private String name;
// getter 和 setter 方法
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
解释:
@NotNull
确保name
属性不为null
。@Size(min = 2, max = 30)
确保name
属性的长度在 2 到 30 之间。
二、Apache Commons Validator
Apache Commons Validator 是 Apache 提供的验证框架,它不仅可以用于服务器端验证,还可以用于客户端验证。它提供了丰富的验证规则和实用工具,可用于验证日期、数字、电子邮件、URL 等。
添加依赖:
<dependency>
<groupId>commons-validator</groupId>
<artifactId>commons-validator</artifactId>
<version>1.7</version>
</dependency>
使用示例:
import org.apache.commons.validator.routines.EmailValidator;
public class ValidationExample {
public static void main(String[] args) {
EmailValidator emailValidator = EmailValidator.getInstance();
boolean isValid = emailValidator.isValid("test@example.com");
System.out.println(isValid);
}
}
解释:
EmailValidator.getInstance()
获取一个EmailValidator
的实例。emailValidator.isValid("test@example.com")
用于验证电子邮件地址是否有效。
三、Google Guava 的 Preconditions
Google Guava 的 Preconditions 类提供了一些简单的静态方法,用于检查参数的前置条件,虽然它不是一个完整的数据验证框架,但在方法级别的参数验证中非常有用。
添加依赖:
<dependency>
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
<version>30.1-jre</version>
</dependency>
使用示例:
import com.google.common.base.Preconditions;
public class PreconditionExample {
public static void main(String[] args) {
try {
int value = -1;
Preconditions.checkArgument(value > 0, "Value must be positive");
} catch (IllegalArgumentException e) {
System.out.println(e.getMessage());
}
}
}
解释:
Preconditions.checkArgument(value > 0, "Value must be positive")
检查value
是否大于 0,如果不满足条件会抛出IllegalArgumentException
并输出自定义错误消息。
以上这些组件都有各自的特点和优势,你可以根据自己的需求选择使用。Spring Boot 自带的 spring-boot-starter-validation
对于大多数 Web 应用的数据验证需求已经足够,而 Apache Commons Validator 对于一些通用的验证规则,如验证电子邮件、URL 等更具优势。Google Guava 的 Preconditions 则更侧重于方法参数的前置条件检查。