java - 带有自定义 HandlerMethodArgumentResolver 的 Spring MVC @Valid 验证

标签 java spring

我想注册一个自定义 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/

相关文章:

java - Android DatePicker 对话框限制最小年份和最大年份

Java JDBC数据库连接登录

java - 使用 Spring MVC 在 JSP 页面中显示一组对象

java - Spring 拒绝缺少供应商 header 的请求(自定义 MIME 类型)

java - Hibernate返回 "weird"连接

java - 如何在 spring 上下文中更正 bean 的注入(inject)映射

java - android 获取命令的stderr

java - 根据休息标准,哪个休息 API url 更好?

java - Spring @JsonIgnore 序列化未按预期工作

spring - 如何在基于 Spring 的响应式(Reactive)应用程序中从身份验证中排除路径?