使用自定义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
注释和调用验证逻辑相关的代码。
您可能可以从中派生您的代码HandlerMethodResolverArgumentResolver
,ModelAttributeMethodProcessor
并super.validateIfApplicable(..)
至少以这种方式调用现有代码。