2010-10-03 65 views
3

如果此問題之前已被問過,請道歉。我希望有人能介入並幫我弄清楚爲什麼我的表單驗證錯誤沒有顯示出來。Spring MVC表單:錯誤未顯示

我使用的是Spring 3.0.3和Hibernate,我使用jsr-303驗證來驗證我的表單輸入。我有一個Spring控制器,它可以處理GET頁面,該頁面包含一個藉助Spring的表單taglib創建的表單。在這種形式下,用戶可以更改他們的名字並將其保存到數據庫中。如果任何輸入爲空,那麼包含該表單的頁面應該再次顯示並顯示錯誤消息。同一個控制器處理頁面的提交。看起來控制器在大多數方面都能正常工作,但是當用戶提交的表單出現錯誤時,頁面上不會顯示任何錯誤。

這裏是什麼看起來像形式:

<form:form commandName="changeNameCommand"> 
    <form:errors path="*" cssClass="errorBox" /> 

    <table width="100%" border="0" cellspacing="5" cellpadding="5" align="left"> 
     <tr> 
    <td><b>First Name:</b></td> 
    <td><form:input path="firstName" value="${user.firstName}" /></td> 
    </tr> 
    <tr> 
    <td><b>Last Name:</b></td> 
    <td> <form:input path="lastName" value="${user.lastName}" /></td> 
    </tr> 
</table> 
</form:form>  

注意,所以存在被用來填充與用戶當前的姓和名的形式查看用戶對象。這工作正常。

控制器看起來是這樣的:

@Controller 
@RequestMapping(value = "/account/settings/change-name") 
@SessionAttributes("changeNameCommand") 
public class ChangeNameController { 

    @ModelAttribute("changeNameCommand") 
    public ChangeNameCommand getCommand() { 
     return new ChangeNameCommand(); 
    } 

    @RequestMapping(method = RequestMethod.GET) 
    public ModelAndView getChangeNamePage(HttpServletRequest req) { 
    ModelAndView mav = new ModelAndView("Account.ChangeName"); 
     mav.addObject("page_title", "Change Name"); 

     return mav; 
    } 

    @RequestMapping(method = RequestMethod.POST) 
    public String doChangeName(
       @ModelAttribute("changeNameCommand") 
        @Valid ChangeNameCommand command, 
        BindingResult result, SessionStatus status) { 

     if (result.hasErrors()) { 
      return "redirect:/account/settings/change-name"; 
     } 

    // Code here to persist updated user first and last name to database...   

     status.setComplete(); 

     return "redirect:/home"; 
    } 
} 

我使用Tiles 2.1.2撰寫頁面和Urlrewrite 3.1.0,幫助形成友好的URL。

的ChangeNameCommand類看起來是這樣的:

import org.hibernate.validator.constraints.NotEmpty; 

public class ChangeNameCommand { 

    @NotEmpty(message = "You must provide a first name.") 
    private String firstName; 

    @NotEmpty(message = "You must provide a last name.") 
    private String lastName; 

    @NotEmpty(message = "Your password is required to make changes.") 
    private String currentPassword; 

    // Getters and setters here... 
} 

調試時,我看到,當沒有對第一個或最後一個名字輸入BindingResult實例確實包含錯誤。我擔心的是在發生錯誤時重定向。我在這裏看到其他問題,只是返回視圖名稱而不是使用重定向:前綴。我試過,但(我認爲),因爲我使用Urlrewrite的方式和我的servlet映射設置的方式Spring返回一個錯誤。我已經嘗試過返回

/account/settings/change-name 
/web/account/settings/change-name 
/mywebsite/web/account/settings/change-name 

但無濟於事。 FWIW,這裏是我的servlet映射:

<servlet-mapping> 
    <servlet-name>mywebsite</servlet-name> 
    <url-pattern>/web/*</url-pattern> 
</servlet-mapping> 

任何幫助非常感謝!

回答

1

這是我如何解決我的問題。首先,我不想放棄使用UrlRewriteFilter和Tiles。但是,問題在於,如果出現錯誤,我不能僅返回路徑,如控制器RequestMapping註釋中所示。下面是我的解決方案,在錯誤情況下刪除了重定向,在doChangeName()

@Controller 
@RequestMapping(value = "/account/settings/change-name") 
@SessionAttributes("changeNameCommand") 
public class ChangeNameController { 

    @ModelAttribute("changeNameCommand") 
    public ChangeNameCommand getCommand() {   
     return new ChangeNameCommand(); 
    } 

    @RequestMapping(method = RequestMethod.GET) 
    public ModelAndView getChangeNamePage() { 
     ModelAndView mav = new ModelAndView("Account.ChangeName"); 
     mav.addObject("page_title", "Change Name"); 

     return mav; 
    } 

    @RequestMapping(method = RequestMethod.POST) 
    public ModelAndView doChangeName(@ModelAttribute("changeNameCommand") @Valid ChangeNameCommand command, 
      BindingResult result, SessionStatus status) { 

     if (result.hasErrors 
      ModelAndView mav = new ModelAndView("Account.ChangeName"); 
      mav.addObject("page_title", "Change Name"); 

      return mav; 
     } 

     // Code here to persist updated user first and last name to database...   

     status.setComplete(); 

     RedirectView view = new RedirectView("/home"); 
     return new ModelAndView(view);   
    } 
} 

感謝所有幫助我的人!

3

使用redirect使所有的請求屬性(包括錯誤和整個模型)消失。因此,請勿使用重定向,或使用會話臨時存儲數據或使用會話。或者弄清楚如何使用像閃光燈(我即將在一段時間內)

另一件事 - 使用UrlRewriteFilter與spring-mvc是不需要的。只有使用spring-mvc才能完全控制您喜歡的類似REST的URL。

+0

感謝Bozho。我如何更改我的代碼以在會話中存儲數據?我認爲這種情況已經發生,但顯然不是。謝謝! – richever 2010-10-03 18:52:14