【问题标题】:Redirect or Forward maintaining the BindingResults重定向或转发维护 BindingResults
【发布时间】:2017-01-04 05:21:09
【问题描述】:

我正在寻找一种方法来进行重定向或从一个控制器请求映射转发到另一个。

情况是我有一个控制器,它具有三个阶段:用户输入数据 -> 预览页面 -> 提交。在预览请求映射中,我有模型属性及其 BindingResult。如果我在绑定中有错误,我想使用重定向将用户推回新表单,但是当我这样做时,Spring 会重新评估 ModelAttribute,从而重新创建 BindingResult。

一些代码:

@RequestMapping(value = "\new", method = RequestMethod.GET)
@ApplicationUserCreated
public String formNew(
        @ModelAttribute("formBean") FormBean formBean,
        BindingResult bindingResults,
        Model uiModel) {
    // Do some stuff

    // Send the "new form" view
    return "new.jsp";
}

@RequestMapping("/preview", method = RequestMethod.POST)
@ApplicationUserCreated
public String formPreview(
        @ModelAttribute("formBean") FormBean formBean,
        BindingResult bindingResults,
        Model uiModel) {
    // TODO: Validate the form
    if(bindingResults.hasErrors()) {
        // Redirect them back to the "New" form
        return "redirect:" + "/new";
    } else {
        return "preview.jsp";
    }
}

请原谅任何拼写错误,因为我不得不尝试简化一些代码。我尝试从 formNew() 方法中删除 BindingResults,但是当 Preview 重定向到 New 时,它似乎仍然会覆盖 BindingResults。我也尝试过“前进”,但结果相同。

【问题讨论】:

    标签: java spring-mvc


    【解决方案1】:

    当我需要将用户发送回 new.jsp 时,我最终只是从 formPreview() 调用 formNew()。我没有收到重定向,所以浏览器中的 URL 显示为“/preview”,但至少它可以工作,我觉得我没有浪费时间复制代码。

    【讨论】:

      【解决方案2】:

      如果您至少有 spring 3.1,您可以将 BindingResult 存储在 Session 中,或者您可以尝试使用 Spring Flash Attributes 发送该数据。

      ** 如果 ManagementMovesFormBean 扩展或实现您是 FormBean,您应该在 flash 属性中发送该 bean。

      ** 顺便说一句,为了验证你的表单,你应该在 @ModelAttribute(".....

      前面添加@Valid

      不要忘记将 BindingResult 分配给单个类,在您的示例中,您有 2 个具有不同预期对象的方法,因此这两个 BindingObject 是不同的

      【讨论】:

      • 不幸的是,我们使用的不是 Spring 3.1,而是 3.0.6。而且我们也不使用 JSR 303,只使用作为 Init Binder 进程函数的“验证”。因此,基本上如果模型对象中有一个 Integer,并且 Spring 无法弄清楚如何将用户输入转换为 Integer,它会为类型不匹配绑定一个错误。其余的验证是手动完成的。
      • ok,那么你可以将HttpSession作为参数添加到每个方法中。在#formPreview 中,如果出现错误,您可以将BindingResult 添加到会话中,在#formNew 中您可以验证是否在会话中存储了bindingResult。这听起来如何?
      • 我希望 Spring 有一些漂亮的内置方法来处理这些场景,但我想没有。我最终做的只是直接从 formPreview 调用我的 formNew 方法,传入 BindingResults。我没有得到我想要的重定向 URL,但至少我不依赖于在会话中存储和检索 Spring 生成的对象。
      【解决方案3】:

      我不确定预览页面的用途是什么,但我建议在同一页面上执行验证,并且只有在输入有效时才能继续使用重定向进行预览。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-12-09
        • 1970-01-01
        • 2021-09-14
        • 1970-01-01
        • 1970-01-01
        • 2011-12-07
        • 2016-01-12
        • 1970-01-01
        相关资源
        最近更新 更多