弹簧 - 开机自检后重定向(即使出现验证错误)

我试图弄清楚如何“保存”BindingResult,以便可以通过Spring标签在后续的GET中使用。我想这样做的原因是因为Google App Engine的SSL限制。我有一个通过HTTP显示的表单,帖子是HTTPS URL。如果我只转发而不是重定向,那么用户将看到 https://whatever.appspot.com/my/form URL。我试图避免这种情况。有什么想法如何做到这一点?<form:errors>

以下是我想做的,但我只有在使用时才会看到验证错误。return "create"

@RequestMapping(value = "/submit", method = RequestMethod.POST)
public final String submit(
    @ModelAttribute("register") @Valid final Register register,
    final BindingResult binding) {

    if (binding.hasErrors()) {
        return "redirect:/register/create";
    }

    return "redirect:/register/success";
}

答案 1

从Spring 3.1开始,您可以使用RedirectAttributes。在执行重定向之前,添加您希望可用的属性。将绑定结果和用于验证的对象(在本例中为“注册”)相加。

对于 BindingResult,您将使用名称:“org.springframework.validation.BindingResult。[您的模型属性的名称]”。

对于用于验证的对象,将使用 ModelAttribute 的名称。

要使用RedirectAttributes,您必须将其添加到配置文件中。除其他事项外,您还告诉Spring使用一些较新的类:

<mvc:annotation-driven />

现在,无论您重定向到哪里,都会显示错误

@RequestMapping(value = "/submit", method = RequestMethod.POST)
public final String submit(@ModelAttribute("register") @Valid final Register register, final BindingResult binding, RedirectAttributes attr, HttpSession session) {

if (binding.hasErrors()) {
    attr.addFlashAttribute("org.springframework.validation.BindingResult.register", binding);
    attr.addFlashAttribute("register", register);
    return "redirect:/register/create";
}

return "redirect:/register/success";
}

答案 2

除了奥斯卡的精彩答案之外,如果您遵循这种方法,请不要忘记您实际上是将重定向到的页面。这意味着,如果为重定向的页面(在控制器中)创建该模型属性的新实例,则会丢失验证错误。因此,如果您的POST控制器方法是这样的:RedirectAttributesmodelAttribute

@RequestMapping(value = "/submit", method = RequestMethod.POST)
public final String submit(@ModelAttribute("register") @Valid final Register register, final BindingResult binding, RedirectAttributes attr, HttpSession session) {

if (binding.hasErrors()) {
    attr.addFlashAttribute("org.springframework.validation.BindingResult.register", binding);
    attr.addFlashAttribute("register", register);
    return "redirect:/register/create";
}

return "redirect:/register/success";
}

然后,您可能需要在寄存器创建页面 GET 控制器中进行修改。由此:

@RequestMapping(value = "/register/create", method = RequestMethod.GET)
public String registerCreatePage(Model model) {
    // some stuff
    model.addAttribute("register", new Register());
    // some more stuff
}

@RequestMapping(value = "/register/create", method = RequestMethod.GET)
public String registerCreatePage(Model model) {
    // some stuff
    if (!model.containsAttribute("register")) {
        model.addAttribute("register", new Register());
    }
    // some more stuff
}

资料来源:http://gerrydevstory.com/2013/07/11/preserving-validation-error-messages-on-spring-mvc-form-post-redirect-get/


推荐