【问题标题】:BindingResult Not Working in Display Method (Spring MVC)BindingResult 在显示方法中不起作用(Spring MVC)
【发布时间】:2015-11-22 23:52:54
【问题描述】:

我有一个显示页面的显示页面处理程序。此方法不用于表单提交,仅用于显示页面。

我的问题是,即使在 Display 上,也会出现一些全局错误消息。由于显示错误的唯一方法是将它们添加到 BindingResult,因此我在 Display 方法中添加了一个 Model/BindingResult 参数对:

public ModelAndView display(final HttpServletRequest request, 
                            @ModelAttribute("model") Model model, 
                            BindingResult bindingResult) {

然后,假设我在我的 BindingResult 中添加了一个错误,

bindingResult.addError(new ObjectError("", "message");  

但这不起作用 - 显示的 JSP 没有我的消息。这种方法在 Save 上有效,但在 Display 上无效,可能是因为我没有提交任何表单,这就是我无法获得 BindingResult 的原因。

如何在不提交表单的方法中显示一般错误?为什么 BindingResult 在这个 Display 方法中不起作用?

【问题讨论】:

    标签: spring spring-mvc


    【解决方案1】:

    如您所见,不幸的是,BindingResult 参数仅在绑定期间由框架填充 - 即在您的命令对象填充请求参数时。

    这有点杂乱无章,但您可以通过自己使用预期键显式添加参数来模拟向模型添加 BindingResult 参数的框架:

    public ModelAndView display(MyModel model, BindingResult errors) {
        errors.addError(new ObjectError("", "message"));
    
        return new ModelAndView("myViewName", new ModelMap()
            .addAttribute("myModelKey", model)
            .addAttribute(BindingResult.MODEL_KEY_PREFIX + "myModelKey", errors));
    }
    

    Spring 的<form:/> taglib 现在将处理您添加的错误,就像它们发生在绑定时一样。

    请注意,现在您的方法签名中的参数将永远不会被框架填充(因为这是一个仅显示的控制器操作),因此在您的方法中定义它们可能更有意义。

    【讨论】:

    • 谢谢。我们的解决方案是只保留一个自定义属性“异常”,我们在消息区域中以自定义方式显示该属性。所以对于一般异常,我们避免使用 Spring 的现成错误标签,它们不是来自 Spring 的 Errors/BindingResult 结构,而是来自我们自己的。
    【解决方案2】:

    您可能需要使用 JavaScript 来显示错误

    【讨论】:

      猜你喜欢
      • 2015-01-15
      • 2018-10-05
      • 2018-01-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多