此版本仍在开发中,尚不被认为是稳定的。对于最新的稳定版本,请使用 Spring Framework 6.2.10! |
验证
Spring WebFlux 内置了 Validation@RequestMapping
方法,包括 Java Bean 验证。
验证可以在以下两个级别之一应用:
-
@ModelAttribute、@RequestBody和@RequestPart论点 如果方法参数被注释,解析器会单独验证方法参数 与雅加达
@Valid
或 Spring 的@Validated
,并且没有Errors
或BindingResult
参数,则不需要 AND 方法验证(将 接下来讨论)。在这种情况下引发的异常是WebExchangeBindException
. -
什么时候
@Constraint
注释,例如@Min
,@NotBlank
和其他人被声明 直接在方法参数上,或在方法(对于返回值)上,然后在方法 必须应用验证,并且它取代方法参数级别的验证 因为方法验证涵盖方法参数约束和嵌套约束 通过@Valid
.在这种情况下引发的异常是HandlerMethodValidationException
.
应用程序必须同时处理WebExchangeBindException
和HandlerMethodValidationException
因为根据控制器的不同,可能会升高任何一个
方法签名。然而,这两个例外被设计得非常相似,并且可以
使用几乎相同的代码处理。主要区别在于前者适用于单个
对象,而后者用于方法参数列表。
@Valid 不是约束注释,而是用于
一个对象。因此,就其本身而言@Valid 不会导致方法验证。@NotNull 另一方面是一个约束,并将其添加到@Valid 参数导致方法
验证。特别是对于可空性,您还可以使用required 标志@RequestBody 或@ModelAttribute . |
方法验证可与Errors
或BindingResult
方法
参数。但是,仅当所有验证错误都处于打开状态时,才会调用控制器方法
方法参数与Errors
紧接着。如果
任何其他方法参数,则HandlerMethodValidationException
被提高。
您可以配置Validator
通过 WebFlux 配置全局,或本地
@InitBinder通过@Controller
或@ControllerAdvice
.您还可以使用多个验证器。
如果控制器具有类级别@Validated ,则通过 AOP 代理应用方法验证。为了利用 Spring MVC 内置的对
Spring Framework 6.1 中添加了方法验证,您需要删除类级别@Validated 来自控制器的注释。 |
错误响应部分进一步提供了
详情WebExchangeBindException
和HandlerMethodValidationException
,以及如何通过MessageSource
和
特定于语言环境和语言的资源包。
要进一步自定义处理方法验证错误,可以扩展ResponseEntityExceptionHandler
或使用@ExceptionHandler
控制器中的方法
或在@ControllerAdvice
,并处理HandlerMethodValidationException
径直。
异常包含ParameterValidationResult
对验证错误进行分组的
by method 参数。您可以迭代这些,也可以为访问者提供回调
按控制器方法参数类型划分的方法:
-
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) {
// ...
}
})