使用自定义HandlerMethodArgumentResolver的Spring MVC @Valid验证


问题内容

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

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

我可以注册我的解析器,这只是创建了一个Domain通过重写通过请求参数对象,addArgumentResolver()WebMvcConfigurerAdapter。当Spring尝试解析该Domain参数时,它将遍历其列表HandlerMethodArgumentResolver(有很多),并选择supports()它的第一个。

在上面的例子中,虽然我的解析器将被调用,我的Domain论点将得到初始化,@Valid注释将不会被处理 ,并
为解析器BindingResult,一个ErrorsMethodArgumentResolver是因为它需要一个会失败@ModelAttribute@RequestBody@RequestPart在处理方法的说法,这我不没有。

如果我尝试通过添加来修复它 @ModelAttribute

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

HandlerMethodArgumentResolver实施ModelAttributeMethodProcessor,将首先与检查supports()并解决的说法(与@ModelAttribute@Valid我的自定义冲突解决之前)。该BindingResult不会失败,但我不会对我的自定义创建行为Domain的实例。

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


问题答案:

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

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

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