1. 使用Hibernate Validator进行注解校验
这是Java中最常用 的参数校验方式,基于JSR 303/JSR 380规范的实现,通常结合@Valid
或@Validated
注解进行参数校验。
使用步骤:
-
添加依赖(如果使用Spring Boot,通常已经内置了Hibernate Validator):
<dependency> <groupId>org.hibernate.validator</groupId> <artifactId>hibernate-validator</artifactId> </dependency> -
在DTO类中使用校验注解:
public class UserDTO {
@NotNull(message = "用户名不能为空") @Size(min = 3, max = 20, message = "用户名长度必须在3到20之间") private String username; @Email(message = "邮箱格式不正确") private String email; // 其他字段和getter/setter
}
-
在Controller中使用
@Valid
或@Validated
来触发校验:@PostMapping("/user")
public ResponseEntity<String> createUser(@Valid @RequestBody UserDTO userDTO) {
// 如果校验失败,会自动抛出异常
return ResponseEntity.ok("用户创建成功");
} -
如果需要自定义异常处理,可以在全局异常处理器中处理
MethodArgumentNotValidException
:@ExceptionHandler(MethodArgumentNotValidException.class)
public ResponseEntity<Map<String, String>> handleValidationExceptions(MethodArgumentNotValidException ex) {
Map<String, String> errors = new HashMap<>();
ex.getBindingResult().getAllErrors().forEach(error -> {
String fieldName = ((FieldError) error).getField();
String errorMessage = error.getDefaultMessage();
errors.put(fieldName, errorMessage);
});
return ResponseEntity.badRequest().body(errors);
}
2. 手动校验
对于复杂的业务逻辑,可能需要手动编写校验逻辑。可以通过Java代码在Controller或Service层进行参数的业务校验。
if (userDTO.getUsername() == null || userDTO.getUsername().length() < 3) {
throw new IllegalArgumentException("用户名长度必须大于3");
}
3. 自定义注解
如果Hibernate Validator内置的注解不能满足需求,可以自定义校验注解。比如,创建一个自定义注解来验证某个字段是否满足自定义规则。
自定义注解示例:
-
创建注解:
@Target({ ElementType.FIELD, ElementType.PARAMETER })
@Retention(RetentionPolicy.RUNTIME)
@Constraint(validatedBy = CustomValidator.class)
public @interface CustomConstraint {
String message() default "默认错误信息";
Class<?>[] groups() default {};
Class<? extends Payload>[] payload() default {};
} -
创建校验逻辑:
public class CustomValidator implements ConstraintValidator<CustomConstraint, String> {
@Override public void initialize(CustomConstraint constraintAnnotation) { } @Override public boolean isValid(String value, ConstraintValidatorContext context) { // 自定义校验逻辑 return value != null && value.startsWith("A"); }
}
-
在DTO类中使用自定义注解:
public class UserDTO {
@CustomConstraint(message = "用户名必须以A开头")
private String username;
}
4. Spring的 @RequestParam****和 @PathVariable****校验
对于简单的请求参数,可以在方法参数中使用@RequestParam
和@PathVariable
结合Hibernate Validator注解进行校验。
@GetMapping("/user/{id}")
public ResponseEntity<UserDTO> getUser(
@PathVariable @NotNull(message = "用户ID不能为空") Long id) {
// 获取用户逻辑
}