验证
Spring MVC内置了对@RequestMapping
方法的验证支持,包括使用Java Bean Validation
的选项。验证支持在两个级别上起作用。
首先,对于@ModelAttribute、@RequestBody和@RequestPart方法参数的解析器会在参数具有Jakarta的@Valid
或Spring的@Validated
注解时执行验证,并在必要时引发MethodArgumentNotValidException
。或者,您可以通过在经过验证的参数后立即添加一个Errors
或BindingResult
方法参数来在控制器方法中处理错误。
其次,如果存在Java Bean Validation并且任何方法参数具有@Constraint
注解,则将应用方法验证,必要时引发HandlerMethodValidationException
。对于这种情况,您仍然可以添加一个Errors
或BindingResult
方法参数来处理控制器方法中的验证错误,但如果其他方法参数存在验证错误,则会引发HandlerMethodValidationException
。如果方法带有@Valid
或带有@Constraint
注解,则方法验证也可以应用于返回值。
您可以通过WebMvc配置全局配置Validator
,或者通过@Controller
或@ControllerAdvice
中的@InitBinder
方法本地配置。您还可以使用多个验证器。
如果控制器具有类级别的@Validated ,则通过AOP代理应用方法验证。为了利用Spring Framework 6.1中新增的Spring MVC内置方法验证支持,您需要从控制器中删除类级别的@Validated 注解。 |
错误响应部分提供了有关如何处理MethodArgumentNotValidException
和HandlerMethodValidationException
以及如何通过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) {
// ...
}
})