验证

Spring WebFlux 为 @RequestMapping 方法内置了验证,包括Java Bean 验证。验证可以在两个级别之一应用

  1. Java Bean 验证单独应用于用 @jakarta.validation.Valid 或 Spring 的 @Validated 注解的 @ModelAttribute@RequestBody@RequestPart 方法参数,只要它是一个命令对象而不是 MapCollection 等容器,并且在方法签名中紧随其后没有 ErrorsBindingResult,并且不以其他方式需要方法验证(见下文)。当单独验证方法参数时,会引发 WebExchangeBindException 异常。

  2. @Constraint 注解(如 @Min@NotBlank 等)直接声明在方法参数上,或声明在方法的返回值上时,Java Bean 验证将应用于该方法,它将取代对方法参数单独应用的任何验证,因为方法验证通过 @Valid 涵盖了方法参数约束和嵌套约束。当验证应用于方法时,会引发 HandlerMethodValidationException 异常。

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

@Valid 不是约束注解,而是用于对象中的嵌套约束。因此,@Valid 本身不会导致方法验证。另一方面,@NotNull 是一个约束,将其添加到 @Valid 参数会导致方法验证。对于空值,您还可以使用 @RequestBody@ModelAttributerequired 标志。

方法验证可以与 ErrorsBindingResult 方法参数结合使用。但是,只有当所有验证错误都位于紧随其后带有 Errors 的方法参数上时,才会调用控制器方法。如果任何其他方法参数上存在验证错误,则会引发 HandlerMethodValidationException

您可以通过WebFlux 配置全局配置一个 Validator,或者通过 @Controller@ControllerAdvice 中的@InitBinder 方法本地配置。您还可以使用多个验证器。

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

错误响应部分提供了关于如何处理 WebExchangeBindExceptionHandlerMethodValidationException 的更多细节,以及如何通过 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) {
			// ...
	}
})
© . This site is unofficial and not affiliated with VMware.