2015-04-27 21 views
0

我有一個表單和驗證工作。問題出現在添加url參數時。 url參數是一個令牌,並且是必需的。所以這是我的控制器的樣子:使用URL參數對POST進行SpringBoot/MVC和Thymleaf表單驗證

@RequestMapping(value = "/resetpassword", method = RequestMethod.GET) 
public String showResetForm(ResetPassword resetPassword, Model model, 
     @RequestParam(value = "token", required = true) String token, 
     @RequestParam(value = "msg", required = false) String msg){  

     model.addAttribute("token", token); 

    return "resetpassword"; 
} 

@RequestMapping(value = "/resetpassword", method = RequestMethod.POST) 
public String setPwd(@ModelAttribute("resetPassword") @Valid ResetPassword resetPassword,// RedirectAttributes reDirectAttr, 
        BindingResult bindingResult, Model model, 
        @RequestParam(value = "token", required = true) String token, 
        @RequestParam(value = "msg", required = false) String msg){ 

    if (bindingResult.hasErrors()) { 
      //reDirectAttr.addFlashAttribute("org.springframework.validation.BindingResult.resetPassword",bindingResult); 
      //reDirectAttr.addFlashAttribute("resetPassword",resetPassword);    
     return "resetpassword?token="+token; 
    } 
    else {   
     if (token == null) { 
      // TODO: no token, what to do here?? 
      return "redirect:/resetpassword?token=\"\"&msg=notoken"; 
     } 
     ResetPasswordResponseDto response = super.resetUserPassword(
       resetPassword.getUname(), resetPassword.getPassword(), 
       token); 
     if (response.getPasswordResetResult() == PasswordResetResult.SUCCESSFUL) { 
      // TODO: it worked, what now? 
      return "redirect:/login"; 
     } else if (response.getPasswordResetResult() == PasswordResetResult.INVALID_TOKEN) { 
      // TODO: bad token 
      return "redirect:/resetpassword?token="+token+"&msg=badtoken"; 
     } else if (response.getPasswordResetResult() == PasswordResetResult.OUT_OF_POLICY_PW) { 
      // TODO: out of policy pw 
      return "redirect:/resetpassword?token="+token+"&msg=outofpolicy"; 
     } else if (response.getPasswordResetResult() == PasswordResetResult.LDAP_FAILURE) { 
      // TODO: other failure 
      return "redirect:/resetpassword?token="+token+"&msg=error"; 
     } 
    } 
    return "redirect:/resetpassword?token="+token+"&msg=error"; 
    //return new RedirectView("resetpassword?token=\"\"&msg=notoken"); 
} 

所以我嘗試了一堆東西,但似乎沒有任何工作。當請求視圖/ resetpassword時,這是我想要發生的情況?token = 1232453顯示視圖。然後,如果表單有錯誤,則url參數會保留在url中,並且表單顯示錯誤。現在我收到一個錯誤,說該模板無法解析。好吧不夠公平,所以我試着做一個重定向,而不是

return "redirect:/resetpassword?token="+token; 

這似乎工作,但是URL參數丟失,認爲失去bindingResult錯誤。在代碼中,我發佈了我也嘗試過FlashAttributes,但我只是得到一個錯誤「驗證失敗的對象='resetPassword'。錯誤計數:4」這是正確的,但我需要它來顯示窗體和我與Thymeleaf編碼的錯誤。任何幫助或建議都會很棒!

資源我已經看過: Spring - Redirect after POST (even with validation errors) & SpringMVC controller: how to stay on page if form validation error occurs

回答

0

您是否嘗試返回一個ModelAndView,而不是僅僅重定向字符串?模型上的屬性將作爲URL查詢參數提供。

ModelAndView redirect = new ModelAndView("redirect:/resetpassword"); 
redirect.addObject("token", token); 
redirect.addObject("msg", "error"); 
return redirect; 
+0

我結束了加入'model.addAttribute(「令牌」,令牌);'到這也要求的形式''這看起來很麻煩。我想我會嘗試你的建議。 – JTime