SpringBoot 如何进行参数校验
大约 3 分钟
在Spring Boot中进行参数校验通常是使用JSR 303规范(也称为Bean Validation)的注解和Spring的Validation API来完成的。以下是一些常见的步骤和示例,用于在Spring Boot应用程序中进行参数校验:
添加依赖:
首先,确保在项目的pom.xml
文件中添加以下依赖,以引入Spring Boot和Bean Validation相关的库:<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>javax.validation</groupId> <artifactId>validation-api</artifactId> </dependency> <dependency> <groupId>org.hibernate.validator</groupId> <artifactId>hibernate-validator</artifactId> </dependency>
创建DTO类(数据传输对象):
在你的应用中创建一个DTO类,该类用于接收和验证请求参数。在DTO类的字段上使用Bean Validation注解来指定参数校验规则。例如:import javax.validation.constraints.NotBlank; import javax.validation.constraints.Positive; public class UserDTO { @NotBlank(message = "用户名不能为空") private String username; @Positive(message = "年龄必须为正整数") private int age; // Getter和Setter方法 }
在Java中,Bean Validation提供了一组常见的约束注解,用于对数据进行校验。以下是一些常见的约束注解:
@NotNull
: 用于标记字段不能为null。@NotEmpty
: 用于标记字段不能为空,可以用于字符串、集合、数组等。@NotBlank
: 用于标记字符串字段不能为空且必须至少包含一个非空格字符。@Size(min, max)
: 用于指定字符串、集合或数组的大小必须在指定的范围内。@Min(value)
: 用于标记数值字段的最小值。@Max(value)
: 用于标记数值字段的最大值。@DecimalMin(value)
: 用于标记十进制数值字段的最小值。@DecimalMax(value)
: 用于标记十进制数值字段的最大值。@Digits(integer, fraction)
: 用于指定数值字段的整数和小数部分的最大位数。@Pattern(regexp)
: 用于标记字符串字段必须匹配指定的正则表达式。@Email
: 用于标记字符串字段必须是有效的电子邮件地址格式。@Future
和@FutureOrPresent
: 用于标记日期字段必须是将来的日期或将来或当前日期。@Past
和@PastOrPresent
: 用于标记日期字段必须是过去的日期或过去或当前日期。@AssertTrue
和@AssertFalse
: 用于标记字段必须为true或false。@Positive
和@PositiveOrZero
: 用于标记数值字段必须为正数或正数或零。@Negative
和@NegativeOrZero
: 用于标记数值字段必须为负数或负数或零。
这些约束注解可以根据需要单独或组合使用,以对不同类型的数据进行校验。在Spring Boot应用程序中,你可以使用这些注解来定义DTO(数据传输对象)或实体类的字段上,然后通过@Valid
注解来触发校验,确保数据的有效性和一致性。
在控制器中使用DTO:
在你的控制器中,使用上面创建的DTO类作为请求参数,Spring Boot将自动执行参数校验并将错误信息返回给客户端。例如:import org.springframework.web.bind.annotation.*; @RestController @RequestMapping("/api/users") public class UserController { @PostMapping("/create") public ResponseEntity<String> createUser(@Valid @RequestBody UserDTO userDTO) { // 处理创建用户的逻辑 return ResponseEntity.ok("用户创建成功"); } }
在上面的示例中,
@Valid
注解用于告诉Spring Boot对UserDTO
对象进行参数校验,如果校验失败,将会返回一个包含错误信息的响应。自定义错误处理(可选):
你可以创建一个全局异常处理器来自定义处理参数校验失败的错误。例如:import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.MethodArgumentNotValidException; import org.springframework.web.bind.annotation.*; @ControllerAdvice public class GlobalExceptionHandler { @ExceptionHandler(MethodArgumentNotValidException.class) public ResponseEntity<String> handleValidationException(MethodArgumentNotValidException ex) { String errorMessage = ex.getBindingResult().getFieldErrors().get(0).getDefaultMessage(); return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(errorMessage); } }
在上面的例子中,我们捕获了
MethodArgumentNotValidException
异常,该异常会在参数校验失败时抛出,然后我们从异常中提取出错误信息并返回一个包含错误消息的BAD_REQUEST
响应。