Spring Boot 自动参数校验
在 Spring Boot 中实现参数自动校验主要依靠 Java Bean Validation API(JSR 380)和 Spring 的集成支持。以下是详细实现步骤:
1. 添加依赖
在 pom.xml
中添加验证依赖:
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-validation</artifactId>
</dependency>
2. 在实体类/DTO中添加校验注解
使用注解标记需要校验的字段:
public class UserDTO {@NotBlank(message = "用户名不能为空")private String username;@Email(message = "邮箱格式不正确")private String email;@Min(value = 18, message = "年龄必须大于18岁")private int age;@Pattern(regexp = "1[3-9]\\d{9}", message = "手机号格式不正确")private String phone;// Getter/Setter省略
}
常用校验注解:
@NotNull
:非 null@NotBlank
:非空(字符串)@NotEmpty
:非空集合/数组@Min
/@Max
:数值范围@Size
:长度范围@Email
:邮箱格式@Pattern
:正则表达式
3. 在Controller中使用校验
在接收参数的请求方法中添加 @Valid
或 @Validated
:
@PostMapping("/create")
public ResponseEntity<?> createUser(@Valid @RequestBody UserDTO userDTO) {// 校验通过后执行业务逻辑return ResponseEntity.ok("用户创建成功");
}
注意:
@Valid
是标准 JSR 注解,@Validated
是 Spring 的增强版(支持分组校验)。
4. 处理校验异常
添加全局异常处理器捕获校验失败异常:
@RestControllerAdvice
public class GlobalExceptionHandler {@ExceptionHandler(MethodArgumentNotValidException.class)public ResponseEntity<Map<String, String>> handleValidationException(MethodArgumentNotValidException ex) {Map<String, String> errors = new HashMap<>();ex.getBindingResult().getFieldErrors().forEach(error -> {errors.put(error.getField(), error.getDefaultMessage());});return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(errors);}
}
响应示例:
{"username": "用户名不能为空","email": "邮箱格式不正确"
}
5. 进阶用法
分组校验(不同场景不同规则)
-
定义分组接口:
public interface CreateGroup {} public interface UpdateGroup {}
-
在 DTO 中指定分组:
public class UserDTO {@NotNull(groups = UpdateGroup.class, message = "ID不能为空")private Long id;@NotBlank(groups = {CreateGroup.class, UpdateGroup.class})private String name; }
-
Controller 指定分组:
@PostMapping("/update") public void updateUser(@Validated(UpdateGroup.class) @RequestBody UserDTO dto) {// ... }
自定义校验注解
-
创建自定义注解:
@Target({FIELD}) @Retention(RUNTIME) @Constraint(validatedBy = PhoneValidator.class) public @interface ValidPhone {String message() default "手机号格式错误";Class<?>[] groups() default {};Class<? extends Payload>[] payload() default {}; }
-
实现校验逻辑:
public class PhoneValidator implements ConstraintValidator<ValidPhone, String> {@Overridepublic boolean isValid(String phone, ConstraintValidatorContext context) {return phone != null && phone.matches("1[3-9]\\d{9}");} }
6. 测试校验
使用 Postman 或 curl 发送无效请求:
curl -X POST http://localhost:8080/create \
-H "Content-Type: application/json" \
-d '{"username":"", "email":"invalid-email"}'
将返回:
{"username": "用户名不能为空","email": "邮箱格式不正确"
}
总结流程:
graph TDA[添加依赖] --> B[DTO添加校验注解]B --> C[Controller添加@Valid]C --> D[全局异常处理器]D --> E[返回错误信息]
通过以上步骤,Spring Boot 会自动完成参数校验,无需手动编写校验逻辑,大幅提升开发效率。