验证

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

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

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

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

@Valid不是约束注释,而是用于 一个 Object。因此,就其本身而言@Valid不会导致方法验证。@NotNull另一方面是一个 constraint,将其添加到@Valid参数导致方法 验证。具体来说,对于可为 null 性,您还可以使用required的标志@RequestBody@ModelAttribute.

方法验证可与ErrorsBindingResult方法 参数。但是,仅当所有验证错误都处于打开状态时,才会调用 controller 方法 方法参数替换为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 中添加的方法验证,你需要删除 class 级别@Validated注解。

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

要进一步自定义处理方法验证错误,您可以扩展ResponseEntityExceptionHandler或使用@ExceptionHandler控制器中的方法 或在@ControllerAdvice和句柄HandlerMethodValidationException径直。 该异常包含ParameterValidationResult对验证错误进行分组 by 方法参数。您可以迭代这些内容,也可以为访客提供回传 按控制器方法参数类型划分的方法: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) {
			// ...
       }
})