依赖引入
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-validation</artifactId>
<version>3.x.x</version> <-- 跟随spring boot版本-->
</dependency>
1. request入参校验
在接口处增加注解@Validated
@RestController
public class ValidationTestController {
@PostMapping("/user")
public void addUser(@RequestBody @Validated UserDto userDto) {
System.out.println(userDto);
}
@GetMapping("/user")
public String getUser(@RequestParam("age") @Validated @Min(value = 16, message = "年龄最小为16") Integer age,
@RequestParam("nickname") @Validated @Size(min = 4, message = "搜索昵称长度最短为4") String nickname) {
return "nickname: " + nickname + ", age: " + age;
}
}
@Getter
@Setter
@AllArgsConstructor
@NoArgsConstructor
public class UserDto {
@NotBlank(message = "name is required")
private String name;
private String nickName;
@Min(value = 1, message = "age is older than zero")
@Max(value = 120, message = "age is letter than 120")
private int age;
}
常用校验注解
常用注解 | 作用 |
---|---|
@NotEmpty | 字符串/集合非空 |
@NotNull | 值不能为null |
@NotBlank | 字符串包含非空格字符 |
@Min | 数字最小值 |
@Max | 数字最大值 |
@Size | 集合/字符串长度范围 |
@Pattern | 正则表达式匹配 |
邮箱格式校验 | |
@Past | 值为已经过去的日期 |
@Future | 值为未来的日期 |
2. 全局异常处理
校验失败,通常会抛出异常MethodArgumentNotValidException
或HandlerMethodValidationException
,一般情况下会做统一处理
@RestControllerAdvice
public class GlobalExceptionHandler {
@ExceptionHandler(MethodArgumentNotValidException.class)
public ResponseEntity<Result<String>> handleValidationException(
MethodArgumentNotValidException ex) {
List<FieldError> errors = ex.getBindingResult().getFieldErrors();
Map<String, String> errorMap = new LinkedHashMap<>();
errors.forEach(error ->
errorMap.put(error.getField(), error.getDefaultMessage()));
return ResponseEntity.badRequest()
.body(Result.error(ILLEGAL_ARGS.name(), errorMap.toString()));
}
@ExceptionHandler(HandlerMethodValidationException.class)
public ResponseEntity<Result<String>> handlerMethodValidationException(
HandlerMethodValidationException ex) {
Map<String, String> errors = new LinkedHashMap<>();
ex.getParameterValidationResults().forEach(result -> {
MethodParameter param = result.getMethodParameter();
// 生成参数标识(类型 + 位置)
String paramKey = String.format("%s#%d",
param.getParameterName(),
param.getParameterIndex());
result.getResolvableErrors().forEach(error ->
errors.put(paramKey, error.getDefaultMessage())
);
});
return ResponseEntity.badRequest()
.body(Result.error(ILLEGAL_ARGS.name(), errors.toString()));
}
}