验证
Spring WebFlux 内置了对 @RequestMapping 方法的 验证 支持,包括 Java Bean 验证。
验证可以在以下两个级别之一应用:
-
@ModelAttribute、 @RequestBody 和 @RequestPart 参数解析器会在满足以下条件时单独验证方法参数:如果方法参数使用 Jakarta
@Valid或 Spring 的@Validated注解进行标注,并且 紧随其后没有Errors或BindingResult参数,并且 不需要方法验证(接下来会讨论)。在这种情况下抛出的异常是WebExchangeBindException。 -
当
@Constraint注解(如@Min、@NotBlank等)直接声明在方法参数上或方法上(用于返回值)时,必须应用方法验证,这会取代方法参数级别的验证,因为方法验证涵盖了方法参数约束和通过@Valid实现的嵌套约束。在这种情况下抛出的异常是HandlerMethodValidationException。
应用程序必须处理 WebExchangeBindException 和 HandlerMethodValidationException,因为它们可能会根据控制器方法签名而抛出。然而,这两个异常设计得非常相似,并且可以使用几乎相同的代码进行处理。主要区别在于前者针对单个对象,而后者针对方法参数列表。
|
|
方法验证可以与 Errors 或 BindingResult 方法参数结合使用。但是,只有当所有验证错误都发生在紧随其后带有 Errors 的方法参数上时,控制器方法才会被调用。如果任何其他方法参数上存在验证错误,则会抛出 HandlerMethodValidationException。
您可以通过 WebFlux 配置 全局配置 Validator,或者通过 @Controller 或 @ControllerAdvice 中的 @InitBinder 方法局部配置。您也可以使用多个验证器。
|
如果控制器具有类级别的 |
错误响应 部分提供了关于如何处理 WebExchangeBindException 和 HandlerMethodValidationException 的更多详细信息,以及如何通过 MessageSource 和特定于区域设置和语言的资源包来自定义它们的渲染。
为了进一步自定义处理方法验证错误,您可以扩展 ResponseEntityExceptionHandler 或在控制器或 @ControllerAdvice 中使用 @ExceptionHandler 方法,并直接处理 HandlerMethodValidationException。该异常包含一个 ParameterValidationResult 列表,该列表按方法参数对验证错误进行分组。您可以遍历这些错误,或者为控制器方法参数类型提供一个带有回调方法的访问器:
-
Java
-
Kotlin
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) {
// ...
}
});
// HandlerMethodValidationException
val ex
ex.visitResults(object : HandlerMethodValidationException.Visitor {
override fun requestHeader(requestHeader: RequestHeader, result: ParameterValidationResult) {
// ...
}
override fun requestParam(requestParam: RequestParam?, result: ParameterValidationResult) {
// ...
}
override fun modelAttribute(modelAttribute: ModelAttribute?, errors: ParameterErrors) {
// ...
}
// ...
override fun other(result: ParameterValidationResult) {
// ...
}
})