接口参数校验不应该散落在 Service 里写 if。这个项目使用 Jakarta Validation,把规则贴在 DTO 和 Controller 参数上。
一、请求体校验
@PostMapping("/user")
public ApiResponse<UserDTO> add(@Valid @RequestBody UserDTO dto) {
...
}
DTO 字段上声明规则:
@NotBlank(message = "登录账号不能为空")
@Size(min = 3, max = 20, message = "账号长度需在3-20个字符之间")
private String username;
二、Query 参数校验
分页参数在 Controller 方法上直接标注:
@Min(value = 1, message = "当前页码必须从1开始")
@RequestParam long current
同时类上要开启:
@Validated
三、常用注解
| 注解 | 用途 |
|---|---|
@NotNull |
不允许 null |
@NotBlank |
字符串非空白 |
@Email |
邮箱格式 |
@Min / @Max |
数值范围 |
@Size |
字符串或集合长度 |
四、校验失败如何返回
校验失败会抛出不同异常:
MethodArgumentNotValidExceptionBindExceptionConstraintViolationException
公共全局异常处理器统一拦截,把错误字段和消息拼成稳定 ApiResponse。
五、踩坑点
@NotNull不等于字符串非空。@Valid只校验当前对象,嵌套对象需要继续标@Valid。- Query 参数校验需要类上的
@Validated。 - 校验消息也应该稳定,方便前端展示。