【问题标题】:POST method returns wrong URL when BindingResult has errors当 BindingResult 有错误时,POST 方法返回错误的 URL
【发布时间】:2016-03-06 12:41:15
【问题描述】:

我有这个 POST 方法,它只验证表单并在表单被验证时返回确认视图,如果任何字段错误,我想发送回注册屏幕。在这种情况下,如果 BindingResult 对象有错误,系统会将用户返回到表单屏幕,但显示的 URL 是“/registerConfirmation”,这应该只是在表单没有错误的情况下。

@RequestMapping(value="/registerConfirmation", method = RequestMethod.POST)
public ModelAndView confirmRegister(@Valid @ModelAttribute("form") RegistrationForm form, BindingResult result){
    logger.info("Sending registration data");
    ModelAndView modelAndView = new ModelAndView();
    if(result.hasErrors()){
        modelAndView.setViewName("register");
        modelAndView.addObject("form", form);
        return modelAndView;
    }
    //more code here

    return modelAndView;

}

我不知道我错过了什么,因为我在许多其他帖子中看到过这样的方法。有什么帮助吗??

非常感谢!!!

【问题讨论】:

    标签: java spring-mvc http-post thymeleaf


    【解决方案1】:

    解决问题的一种方法是使用重定向:

    @RequestMapping(value="/registerConfirmation", method = RequestMethod.POST)
    public String confirmRegister(@Valid @ModelAttribute("form") RegistrationForm form, BindingResult result, RedirectAttributes attr){
         logger.info("Sending registration data");
         if(result.hasErrors()){
           attr.addFlashAttribute("org.springframework.validation.BindingResult.form", result);
           attr.addFlashAttribute("form", form);
           return "redirect:/register";
         }
         //more code here    
         return "redirect:/registerConfirmation";
    }
    

    在你的注册 GET 方法中你应该检查:

    @RequestMapping(value="/register", method = RequestMethod.GET)
    public String showRegister(Model model) {
         ....
        if (!model.containsAttribute("form")) {
            model.addAttribute("form", new RegistrationForm());
        }
        .....
    }
    

    你可以阅读更多in this article
    另外不要忘记使用registerConfirmation 值创建 GET 方法。

    【讨论】:

    • 嗨 Enigo,我有一个 get 方法,我尝试使用重定向,但我丢失了有或没有错误的数据。
    • 那么,@KrOMaG,你还有什么问题吗?
    • 是的,我可以在 /registerConfirmation 中打印出我的对象的值,但是,当我从这个模型重新发送到相同的 POST 方法 /registerConfirmation 时,我得到一个 nullpointerException,就好像我有一个空对象一样!.我还有一个问题,为什么 registerConfirmation 还需要一个注册 GET 和 POST 方法以及一个 GET 和 POST 方法?非常感谢!
    • 好吧,如果您实际上不需要方法,则不需要所有方法:) GET 方法在您进入页面时基本上可以工作。 POST - 当用户按下提交按钮时。因此,您可以选择需要多少种方法。我写了关于 registerConfirmation 的 GET 方法,因为我认为您也想显示该页面。重发时什么对象为空?
    • 我正在按照您之前发布的链接中的示例进行操作,现在我收到“不支持请求方法 'GET'”。我想按两次提交按钮,首先验证数据并将其显示在确认屏幕中,然后从该屏幕(如果用户同意)再次发送并将新用户存储在数据库中。哇,当我想到这个时,它看起来更容易了。
    猜你喜欢
    • 2017-06-27
    • 1970-01-01
    • 2018-03-10
    • 2016-09-12
    • 1970-01-01
    • 2023-03-10
    • 2019-02-20
    • 2017-03-26
    • 1970-01-01
    相关资源
    最近更新 更多