我想注册一个自定义 HandlerMethodArgumentResolver
可以处理以下 @Controller
处理程序方法定义
@RequestMapping(method = RequestMethod.POST)
public String createDomain(@Valid Domain domain, BindingResult errors, @RequestParam("countryId") Long countryId) {
我可以注册我的解析器,它只是通过请求参数创建一个 Domain
对象,方法是从 WebMvcConfigurerAdapter
覆盖 addArgumentResolver()
。当 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
注释和调用验证逻辑相关代码。
您可能可以从 ModelAttributeMethodProcessor
派生您的 HandlerMethodResolverArgumentResolver
并调用 super.validateIfApplicable(..)
至少以这种方式利用现有代码。
关于java - 带有自定义 HandlerMethodArgumentResolver 的 Spring MVC @Valid 验证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18091936/