使用自定义处理程序方法进行春季 MVC @Valid验证

2022-09-02 01:55:05

我想注册一个可以处理以下处理程序方法定义的自定义HandlerMethodArgumentResolver@Controller

@RequestMapping(method = RequestMethod.POST)
public String createDomain(@Valid Domain domain, BindingResult errors, @RequestParam("countryId") Long countryId) {

我可以注册我的解析器,它通过请求参数创建一个对象,通过覆盖来自。当Spring尝试解析该参数时,它会浏览其列表(有很多)并选择它的第一个。DomainaddArgumentResolver()WebMvcConfigurerAdapterDomainHandlerMethodArgumentResolversupports()

在上面的示例中,尽管我的解析器将被调用并且我的参数将被初始化,但注释将不会被处理,并且 的解析器将失败,因为它需要一个 ,或者处理程序方法中的参数,而我没有。Domain@ValidBindingResultErrorsMethodArgumentResolver@ModelAttribute@RequestBody@RequestPart

如果我尝试通过添加@ModelAttribute

@RequestMapping(method = RequestMethod.POST)
public String createDomain(@Valid @ModelAttribute Domain domain, BindingResult errors, @RequestParam("countryId") Long countryId) {

一个实现, 将首先检查并解决参数(with and ),然后再使用我的自定义解析器。不会失败,但我不会在实例上具有自定义创建行为。HandlerMethodArgumentResolverModelAttributeMethodProcessorsupports()@ModelAttribute@ValidBindingResultDomain

我可以复制粘贴代码以进行验证并添加到 中的模型,但我希望有一种更简单的方法来解析我的参数并执行验证,而无需向模型中添加对象。有这样的方法吗?ModelAttributeMethodProcessor


答案 1

很好地描述了您面临的问题。

我检查了您概述的代码,并得出了与您相同的结论 - 没有内置的方法可以同时应用自定义和相关验证,唯一的选择是执行该操作,即检查参数是否具有注释并调用与验证逻辑相关的代码。HandlerMethodArgumentResolver@ValidModelAttributeMethodProcessor@Valid

您可能至少可以通过这种方式派生并调用现有代码。HandlerMethodResolverArgumentResolverModelAttributeMethodProcessorsuper.validateIfApplicable(..)


答案 2

可能为时已晚,但是您的gets对象作为最后一个参数,然后,要挂接验证,只需将其添加到您的解析器实现中:HandlerMethodArgumentResolverWebDataBinderFactory

Object resolvedObject = // your logic 
if(parameter.hasParameterAnnotation(Valid.class){
            binderFactory.createBinder(webRequest,resolvedObject,"resolvedObjectLogicalName").validate ();
}

推荐