返回

Spring @Validated 的正确打开方式

后端

Spring MVC 参数校验:揭开@Validated和@Valid的神秘面纱

在 Spring MVC 的世界中,参数校验是一个至关重要的工具,它可以帮助我们在应用程序的早期阶段识别和处理错误输入。Spring 提供了两种强大的注解来实现这一功能:@Validated@Valid

@Validated vs. @Valid:了解它们的差异

虽然这两个注解都用于参数校验,但它们之间存在一些微妙的差异:

  • 作用范围: @Validated 可以在方法参数或方法本身上使用,而 @Valid 只能用于方法参数。
  • 校验时机: @Validated 在方法执行之前进行校验,而 @Valid 在方法执行之后进行校验。
  • 校验结果处理: @Validated 将校验结果存储在 BindingResult 对象中,而 @Valid 直接抛出 MethodArgumentNotValidException 异常。

选择最合适的注解

选择 @Validated@Valid 取决于具体的应用程序需求:

  • 如果需要在方法执行之前进行校验,或需要访问校验结果,请使用 @Validated
  • 如果更喜欢在方法执行之后抛出异常的方式,请使用 @Valid

最佳实践建议

在 Spring MVC 中使用参数校验时,遵循以下最佳实践可以确保应用程序的健壮性和可靠性:

  • 优先使用 @Validated @Validated 在方法执行之前进行校验,有助于早期发现和处理错误。
  • 处理 MethodArgumentNotValidException 如果使用 @Valid,请在方法上添加 @ExceptionHandler(MethodArgumentNotValidException.class) 注解以处理校验错误。
  • 引入 hibernate-validator 依赖: 使用 JSR-303 校验注解时,需要在项目中引入 hibernate-validator 依赖。

代码示例

下面是一个使用 @Validated 注解进行参数校验的示例:

@PostMapping("/user")
public User createUser(@Validated User user, BindingResult bindingResult) {
  if (bindingResult.hasErrors()) {
    // 处理校验错误
    return null;
  }
  // 保存用户
  return userService.save(user);
}

常见问题解答

  • 问:@Validated@Valid 哪个更好?
    答:这取决于应用程序的具体需求,但 @Validated 通常是优先选择。
  • 问:我必须在项目中引入什么依赖才能使用参数校验?
    答:需要引入 hibernate-validator 依赖。
  • 问:BindingResult 对象是什么?
    答:BindingResult 对象存储了校验结果,包括错误消息和校验字段。
  • 问:如何使用 JSR-303 校验注解?
    答:JSR-303 校验注解是 Spring 支持的一组标准注解,可以用于对各种数据类型进行校验。
  • 问:参数校验会在什么时候发生?
    答:参数校验通常在 Spring MVC 处理请求之前发生。

结论

@Validated@Valid 注解是 Spring MVC 参数校验的强大工具。理解它们的差异并遵循最佳实践可以帮助开发人员构建健壮且可靠的应用程序。通过及时识别和处理错误输入,我们可以防止应用程序崩溃并为用户提供更好的体验。