Spring MVC命令对象和重定向属性

时间:2015-06-02 08:41:26

标签: spring spring-mvc

我有一个简单的场景:

用户提交表单,如果存在绑定错误,我会重新显示它,否则我会设置一个flash属性并重定向到主页。我无法获得命令对象和RedirectAttributes一起玩,但我可以验证命令对象或使用重定向属性,但不能同时使用两者。这给了我一个400 Bad Request

@RequestMapping(value = "/set", method = RequestMethod.POST)
public String setPassword(@AuthenticationPrincipal User currentUser,
                          @Validated @ModelAttribute("command") SetPasswordCommand command,
                          RedirectAttributes redirectAttributes,
                          BindingResult bindingResult) {
    if (bindingResult.hasErrors())
        return SET_PASSWORD_VIEW_PATH;
    ...
    redirectAttributes.addFlashAttribute("flashMessage", "Password changed");
    return "redirect:/";
}

这有效,但没有闪光灯属性:

@RequestMapping(value = "/set", method = RequestMethod.POST)
public String setPasswordPost(@AuthenticationPrincipal User currentUser,
                              @Validated @ModelAttribute("command") SetPasswordCommand command,
                              BindingResult bindingResult) {
    if (bindingResult.hasErrors())
        return SET_PASSWORD_VIEW_PATH;
    ...
    return "redirect:/";
}

处理此类事情的推荐模式是什么?

1 个答案:

答案 0 :(得分:0)

您的方法签名是错误的,正如here所述,BindingResult必须直接遵循模型属性。

  前一个命令或表单对象的

org.springframework.validation.Errors / org.springframework.validation.BindingResult验证结果(紧接在前的方法参数)。

RedirectAttributes之后移动BindingResult会使其有效。

@RequestMapping(value = "/set", method = RequestMethod.POST)
public String setPassword(@AuthenticationPrincipal User currentUser,
                      @Validated @ModelAttribute("command") SetPasswordCommand command,
                      BindingResult bindingResult,
                      RedirectAttributes redirectAttributes) { ... }