2012-03-27 100 views
0

我一直在這花費好幾個小時,所以現在是時候提問了。如何顯示來自Spring驗證器的錯誤消息?

控制器

@RequestMapping(value="/articleHeaderEdit/{articleId}", method=RequestMethod.POST) 
public ModelAndView submitHeader(@PathVariable Integer articleId, @ModelAttribute("screenObject") ArticleHeaderEditScreenObject articleHeaderEditScreenObject, @ModelAttribute("article") Article article, BindingResult bindingResult, Model model, Locale locale) throws Exception { 
    validator.validate(articleHeaderEditScreenObject, bindingResult); 

    ModelAndView modelAndView=new ModelAndView(); 

    if(bindingResult.hasErrors()) { 
     initializeScreenObject(articleHeaderEditScreenObject, article, locale); 
     modelAndView.setViewName(WebView.ARTICLE_HEADER_EDIT_PAGE.getViewName()); 

    } else { 
     modelAndView.setViewName("redirect:/article/" + articleId); 
    } 

    return modelAndView; 
} 

驗證

@Component 
public class ArticleHeaderEditScreenObjectValidator implements Validator { 
    @Override 
    public boolean supports(Class<?> clazz) { 
     return ArticleHeaderEditScreenObject.class.isAssignableFrom(clazz); 
} 

@Override 
public void validate(Object validatedObject, Errors errors) { 
    ValidationUtils.rejectIfEmptyOrWhitespace(errors, "title", "required.title", "Title is required."); 
} 

查看(僅適用於相關的HTML)

<form:form modelAttribute="screenObject" action="${screenObject.getFormAction()}"> 

    <form:errors path="*" /> 

    <form:errors /> 

    <form:input path="title" /> 
    <form:errors path="title" /> 

錯誤在那裏。我得到正確的看法,並通過調試再次檢查。儘管三種錯誤標籤都不起作用。當我提交頁面時,它會保留新輸入的數據,因此模型可以正常工作。

我看到很多人爲此而苦苦掙扎。一般來說,模型屬性在表單和控制器中有不同的名稱,但在這種情況下它們是相同的。任何想法還缺少什麼?

+0

您可以發佈您的驗證碼? – 2012-03-27 15:25:20

+0

我已經添加了驗證器並更新了代碼。我仍然試圖讓事情發揮作用。 – jacekn 2012-03-28 01:52:20

+0

原因Spring對這篇文章中的第二個模型屬性感到困惑。當我從參數列表中取出@ModelAttribute(「article」)Article article時,錯誤顯示在頁面上。非常非常混亂的東西...... – jacekn 2012-03-28 02:15:03

回答

2

祕訣是按照傳遞給submitHeader方法的參數。

Spring文檔明確指出BindingResult bindingResult參數應該準確地寫在要驗證的模型對象之後。

所以,如果您傳遞多個ModelAttributes,那麼在它之後具有BindingResult的人將會將所有錯誤綁定到該對象。

因此,在您的情況下,BindingResult將具有特定於Article對象的錯誤,而不是ArticleHeaderEditScreenObject對象。從春天文檔

參考意見:

的錯誤或BindingResult參數必須遵循被立即綁定方法簽名可能有不止一個模型對象和Spring將創建一個單獨BindingResult模型對象例如爲他們每個人,因此下面的示例將不起作用:

http://static.springsource.org/spring/docs/3.1.x/spring-framework-reference/html/mvc.html#d0e29628

相關問題