此版本仍在开发中,尚不被认为是稳定的。对于最新的稳定版本,请使用 Spring Framework 6.2.10spring-doc.cadn.net.cn

验证

Spring WebFlux 内置了 Validation@RequestMapping方法,包括 Java Bean 验证。验证可以在以下两个级别之一应用:spring-doc.cadn.net.cn

  1. @ModelAttribute@RequestBody@RequestPart参数如果方法参数被注释,解析器会单独验证方法参数与雅加达@Valid或 Spring 的@Validated并且没有ErrorsBindingResult参数,则不需要 AND 方法验证(要接下来讨论)。在这种情况下引发的异常是WebExchangeBindException.spring-doc.cadn.net.cn

  2. 什么时候@Constraint注释,例如@Min,@NotBlank和其他的声明直接在方法参数上或方法(对于返回值)上,则方法必须应用验证,并且取代方法参数级别的验证因为方法验证涵盖了方法参数约束和嵌套约束 通过@Valid. 在这种情况下引发的异常是HandlerMethodValidationException.spring-doc.cadn.net.cn

应用程序必须同时处理WebExchangeBindExceptionHandlerMethodValidationException因为根据控制器可能会引发任何一个方法签名。然而,这两个例外被设计得非常相似,并且可以用几乎相同的代码处理。主要区别在于前者适用于单个对象,而后者用于方法参数列表。spring-doc.cadn.net.cn

@Valid不是约束注释,而是用于对象中的嵌套约束。因此,就其本身而言@Valid不会导致方法验证。@NotNull另一方面是一个约束,并将其添加到@Valid参数导致方法 验证。 特别是对于可空性,您还可以使用required标志@RequestBody@ModelAttribute.

方法验证可与ErrorsBindingResult方法 参数。 但是,仅当所有验证错误都处于method 参数上时,才会调用控制器方法,并带有Errors紧接着。如果任何其他方法参数,则如果存在验证错误,则HandlerMethodValidationException被提高。spring-doc.cadn.net.cn

您可以配置Validator通过 WebFlux 配置全局,或在本地@InitBinder通过@Controller@ControllerAdvice. 您还可以使用多个验证器。spring-doc.cadn.net.cn

如果控制器具有类级别@Validated,则通过AOP代理应用方法验证。为了利用Spring MVC内置的对方法验证的支持在Spring Framework 6.1中添加,您需要删除类级别@Validated来自控制器的注释。

错误响应部分提供了进一步的有关如何作的详细信息WebExchangeBindExceptionHandlerMethodValidationException,以及如何通过MessageSource和 特定于语言环境和语言的资源包。spring-doc.cadn.net.cn

要进一步自定义处理方法验证错误,可以扩展ResponseEntityExceptionHandler或使用@ExceptionHandler控制器中的方法或在@ControllerAdvice,并处理HandlerMethodValidationException径直。 异常包含ParameterValidationResult对验证错误进行分组的by method 参数。您可以迭代这些,也可以向访问者提供回调按控制器方法参数类型:spring-doc.cadn.net.cn

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) {
			// ...
	}
})