跳到主要内容
版本:7.0.3

验证

Hunyuan 7b 中英对照 Validation

Spring WebFlux 为 @RequestMapping 方法内置了 验证 功能,其中包括 Java Bean 验证。验证可以在两个层次之一进行应用:

  1. Java Bean Validation可以单独应用于被@jakarta.validation.Valid或Spring的@Validated注解标注的@ModelAttribute@RequestBody@RequestPart方法参数,前提是这些参数是命令对象(command object),而不是MapCollection这样的容器;同时,方法签名中不能紧接着有ErrorsBindingResult;此外,如果该方法本身不需要其他形式的验证(详见下文)。在单独验证方法参数时,会抛出WebExchangeBindException异常。

  2. @Min@Blank@Constraint注解直接标注在方法参数上,或者这些注解被标注在方法的返回值上时,Java Bean Validation也会对该方法进行验证。此时,该方法上的验证会覆盖对方法参数单独进行的任何其他形式的验证,因为方法验证通过@Valid同时涵盖了方法参数的约束条件以及嵌套的约束条件。当对方法进行验证时,会抛出HandlerMethodValidationException异常。

应用程序必须同时处理 WebExchangeBindExceptionHandlerMethodValidationException,因为根据控制器方法的签名,这两种异常都有可能被抛出。然而,这两种异常的设计非常相似,可以用几乎相同的代码来处理它们。主要的区别在于,前者是针对单个对象的,而后者则是针对方法参数列表的。

备注

@Valid 并不是一种约束注解,而是用于对象内部的嵌套约束。因此,单独使用 @Valid 并不会引发方法验证。另一方面,@NotNull 则是一种约束注解,将其添加到带有 @Valid 的参数上会触发方法验证。对于空值性问题,你也可以使用 @RequestBody@ModelAttributerequired 标志来处理。

方法验证可以与ErrorsBindingResult方法参数结合使用。但是,只有当所有验证错误都出现在方法参数上,并且紧接着有一个Errors对象时,控制器方法才会被调用。如果任何其他方法参数存在验证错误,则会抛出HandlerMethodValidationException

你可以通过WebFlux配置全局配置Validator,或者通过在@Controller@ControllerAdvice中的@InitBinder方法进行局部配置。你也可以使用多个验证器。

备注

如果一个控制器具有类级别的 @Validated 注解,那么方法验证将通过 AOP 代理进行应用(参见 [../../../core/validation/beanvalidation.md#validation-beanvalidation-spring-method])。为了利用 Spring Framework 6.1 中添加的 Spring MVC 内置方法验证支持,你需要从控制器中移除类级别的 @Validated 注解。

错误响应部分提供了关于如何处理WebExchangeBindExceptionHandlerMethodValidationException的更多细节,同时还介绍了如何通过MessageSource以及特定于地区和语言的资源包来自定义它们的渲染方式。

对于方法验证错误的进一步自定义处理,您可以扩展ResponseEntityExceptionHandler,或在控制器中或@ControllerAdvice中使用@ExceptionHandler方法来直接处理HandlerMethodValidationException。该异常包含一个ParameterValidationResult列表,这些结果按方法参数对验证错误进行分组。您可以选择遍历这些结果,或者根据控制器方法参数类型提供相应的回调方法:

HandlerMethodValidationException ex = ... ;

ex.visitResults(new HandlerMethodValidationException.Visitor() {

@Override
public void requestHeader(RequestHeader requestHeader, ParameterValidationResult result) {
// ...
}

@Override
public void requestParam(@Nullable RequestParam requestParam, ParameterValidationResult result) {
// ...
}

@Override
public void modelAttribute(@Nullable ModelAttribute modelAttribute, ParameterErrors errors) {

// ...

@Override
public void other(ParameterValidationResult result) {
// ...
}
});