2010-11-17 91 views
8

在Spring中,經過驗證,我們在controller中得到一個BindingResult對象。Spring:如何解決驗證錯誤 - >錯誤代碼 - >錯誤信息

足夠簡單,如果我得到驗證錯誤,我想重新顯示我的表單,並在每個受影響的字段上方顯示錯誤消息。

所以檢查領域錯誤的現場usernameFormObject我打電話:

FieldError usernameFieldError = bindingResult.getFieldError("username"); 

太好了,現在我持有FieldError物體,假設我使用的DefaultMessageCodeResolver現在包含類似4個可能的錯誤碼。

我該如何從FieldError - >一個字符串是消費者可以使用的?

我在我的web應用上下文中定義了MessageSource,所以我可以將單個錯誤代碼映射到消息。

但有時默認的信息會最好,有時候我希望兩個錯誤代碼可能有相關的信息,所以我們需要選擇最好的信息。

使用什麼方法來確定最佳可能出現的錯誤消息以顯示字段錯誤?

  • 我是否需要編寫一些算法來檢查所有的錯誤代碼,並從最具體的?
  • 春天是否提供任何幫助確定最具體的錯誤信息?
  • 整個過程看起來如此漫長和複雜,我認爲春天應該讓這件事變得容易。也許我完全脫離基地?

回答

15

正如你所猜測的那樣,你對自己的方式比自己的方式要難。 FieldError對象本身就是MessageSourceResolvable。您不需要取回代碼,然後手動將單個代碼添加到您的消息源並查找。您可以將它傳遞到MessageSource,它會找到最具體的一個,它在您的語言環境中定義了一個翻譯。 (假設你的代碼解析器把它們放在正確的順序)

你真的甚至不需要在大多數情況下,但是。將Errors放在您的支持對象上並自行翻譯它通常不是必需的。 jsp庫中的form名稱空間提供了一個標記,可以爲您查找錯誤消息。您只需將Errors放入ModelMap即可。見文檔:

http://static.springsource.org/spring/docs/3.0.x/spring-framework-reference/html/view.html#view-jsp-formtaglib-errorstag

+0

哦,我明白了,我沒趕上MessageSource.get(MessageSoureResolvable,...),我只注意到了get(字符串,...)選項,這是關鍵環節(實際上我可能已經注意到了,並且在學習新的框架/ API時,我們迷失了無數的細節)。謝謝!! – 2010-11-17 08:20:00

+0

關於JSP taglib的有趣點,我正在使用Velocity,但Spring提供了宏的形式。但我還沒有使用它,因爲它似乎相當反春天,即使我的視圖呈現與春季框架。我認爲我的控制器現在調用Spring特定的MessageSource而不是Java標準的Res​​ourceBundle已經夠糟糕了。但是,也許我正在推翻它?這是我第一次與春天。 – 2010-11-17 08:22:29

+1

確實如此,但就視圖技術而言,通常最終會與*相關聯。*如果您嘗試僅使用JSTL和servlet API,那麼您會做很多重新發明! WebMVC和WebFlow是非侵入性的,使用標籤庫,您可以很容易地創建自己的.tag文件來包裝它們,並將依賴關係「隔離」到稍後可以更改實現的單個位置。使用標籤還可以消除對後臺對象中Errors接口的依賴,使您可以使用無彈簧的pojo。 – Affe 2010-11-17 18:12:51