对于最新稳定版本,请使用Spring Framework 7.0.1spring-doc.cadn.net.cn

验证

Spring MVC 内置了@RequestMapping包括Java Bean Validation在内的方法。 验证可以在两个层级中应用:spring-doc.cadn.net.cn

  1. @ModelAttribute@RequestBody@RequestPart论点 如果方法参数被注释,解析器会单独验证方法参数 与雅加达合作@Valid或者说是Spring的@Validated,而且没有错误绑定结果参数紧接后,不需要方法验证(为 接下来讨论)。本案中提出的例外情况为方法参数非有效异常.spring-doc.cadn.net.cn

  2. 什么时候@Constraint注释如@Min,@NotBlank还有其他被宣布 直接对方法参数,或对方法(返回值)进行,然后对方法进行 必须应用验证,且在方法参数层面优先于验证 因为方法验证既涵盖方法参数约束,也涵盖嵌套约束 通过@Valid.本案中提出的例外情况为HandlerMethodValidationException.spring-doc.cadn.net.cn

应用程序必须同时处理两者方法参数非有效异常HandlerMethodValidationException因为根据控制器不同,任一都可以被抬高 方法签名。然而,这两个例外设计得非常相似,且可以是 处理代码几乎相同。主要区别在于前者是针对单个 而后者则用于方法参数列表。spring-doc.cadn.net.cn

@Valid不是约束注释,而是针对嵌套约束的注释 一个物体。因此,单独而言,@Valid不会导致方法验证。@NotNull另一方面,是一个约束,并将其添加到@Valid参数引向方法 验证。针对空性,你也可以使用必填旗帜@RequestBody@ModelAttribute.

方法验证可与以下方式结合使用错误绑定结果方法 参数。然而,只有当所有验证错误都成立时,控制器方法才被调用 方法参数为错误紧接着。如果在 上存在验证错误 则任意其他方法参数HandlerMethodValidationException被抬高了。spring-doc.cadn.net.cn

你可以配置一个验证器通过WebMvc配置进行全局访问,或通过本地的@InitBinder方法在@Controller@ControllerAdvice.你也可以使用多个验证器。spring-doc.cadn.net.cn

如果控制器有类别级别@Validated然后通过AOP代理应用方法验证。为了利用 Spring MVC 内置的支持 Spring Framework 6.1 中添加了方法验证,你需要移除类级别@Validated控制器的注释。

错误响应部分提供了进一步说明 具体细节方法参数非有效异常HandlerMethodValidationException处理它们,以及如何通过消息源和 按地区和语言提供资源包。spring-doc.cadn.net.cn

为了进一步自定义方法验证错误,可以扩展ResponseEntityExceptionHandler或者使用一个@ExceptionHandler控制器中的方法 或者在@ControllerAdvice,以及手柄HandlerMethodValidationException径直。 该例外包含一个列表参数验证结果将验证错误归类的 由方法参数。你可以对这些内容进行迭代,或者给访客提供回访 按控制器方法参数类型划分的方法: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) {
			// ...
       }
})