如果不在类上添加 @Validated,仅在方法参数上使用 @Valid(如 public void addUser(@Valid User user)),在某些场景下可以生效,但并非所有场景都能正常工作,具体取决于使用场景:
1. 在 Spring MVC 控制器的方法中
-
仅用
@Valid可以生效:
在 Controller 的请求处理方法中(如@PostMapping标注的方法),即使类上没有@Validated,只要参数上添加了@Valid,Spring MVC 会默认触发对该参数的校验(基于 JSR-303 规范)。
例如:
此时如果@RestController public class UserController { // 即使类上没有 @Validated,@Valid 也会生效 @PostMapping("/users") public String addUser(@Valid @RequestBody User user) { return "success"; } }User类的字段上有校验注解(如@NotNull),校验失败会抛出MethodArgumentNotValidException。
2. 在普通 Spring Bean 的方法中(如 Service 层)
-
仅用
@Valid不会生效:
在非 Controller 层的 Bean 中(如 Service 类的方法),如果仅在参数上添加@Valid而类上没有@Validated,Spring 不会触发校验。
例如:
这种情况下,必须在类上添加@Service public class UserService { // 仅 @Valid 不会生效,需要类上有 @Validated public void addUser(@Valid User user) { // ... } }@Validated,@Valid才会生效:@Service @Validated // 必须添加,否则 @Valid 不生效 public class UserService { public void addUser(@Valid User user) { // ... } }
3. 关于分组校验
- 如果需要使用分组校验(如
@Validated(AddGroup.class)),必须在类上添加@Validated,否则分组参数无法被 Spring 识别,校验不会按预期执行。
总结
-
Controller 层:仅用
@Valid即可触发请求参数校验(Spring MVC 特殊支持)。 -
非 Controller 层(如 Service):必须在类上添加
@Validated,否则@Valid无效。 -
分组校验:无论哪一层,都必须在类上添加
@Validated才能生效。
因此,为了统一和确保校验逻辑在所有层级都能正常工作,建议在需要校验的类上显式添加 @Validated,并配合 @Valid 使用。









网友评论