2009-11-11 9 views
1

在Spring SimpleFormController中將Business Objects用作formBackingObjects的設計問題。Spring formBackingObject,業務對象創建和工廠

我們的控制者的責任是允許最終用戶爲我們的Web應用程序添加一個新的業務對象。

因此,我們通過formBackingObject(HttpServletRequest請求)方法傳遞業務對象。但是,我們遇到了一個難題。

我們用來創建新業務對象的工廠強制執行業務規則,其中某些屬性不能爲空。但由於我們不知道最終用戶想要輸入什麼內容,我們一直在傳遞「合理的默認值」,例如「請輸入您想要的名稱」,但這看起來似乎很不禮貌。

開發人員要做什麼?我感覺好像這是經典的雞/蛋問題。

我們所有的業務對象都是基於接口的,我們是否應該創建一個代表業務對象的存根,將存根傳遞爲formBackingObject,然後將表單傳遞給工廠以提交表單?或者我們不應該在formBackingObject中傳遞任何東西,然後從請求中手動收集提交的信息?

任何其他合理的想法/模式?

謝謝你的時間。

+0

看看這個討論:http:// stackoverflow。com/questions/378066/best-practice-for-spring-mvc-form-b​​acking-object-tree-initialization –

回答

2

我絕對不會選擇不使用formBackingObject並手動收集信息的選項 - 這將消除許多使Spring MVC首先值得的功能。

如果我是你,我只需要創建一個新的工廠或工廠方法,專門爲創建「未初始化」的業務對象而設計,並將其用作formBackingObject。

廣泛使用的另一種方法是根本不使用業務對象作爲formBackingObject,而是創建一個單獨的傳輸對象,其唯一目的是成爲formBackingObject(然後爲您的業務對象添加一個工廠方法,讓您從傳輸對象初始化它)。這樣做的一大優勢就是,如果您的業務對象內部有深層的其他對象樹,則可能會使用formBackingObject時很痛苦。如果您創建一個單獨的傳輸對象僅用作formBackingObject,則可以給它一個更平坦的結構。

+0

因此,我非常喜歡使用未初始化的業務對象或使用傳輸對象的想法,但是如何使用一個傳輸對象或一個死的簡單POJO(來自matt的b post),然後在struts中使用ActionForm?在某些時候,我們將不得不從transport/POJO中提取信息,並將其放入基於hibernate的業務對象實現類中。我問的唯一理由是因爲我記得這是春天的一個重要賣點。我很感謝不必擴展ActionForm,但結果和行爲對我來說似乎是一樣的。 – hooknc

+0

這是一個公平點。我自己,我更喜歡使用業務對象作爲formBackingObject出於這個原因。另一方面,它不像將數據從一個對象移動到另一個對象的代碼會變得如此複雜。如果您有一個複雜的業務對象,其中每個表單只填充其中的一部分,則此方法可能有意義的一個地方。 –

1

使用命令對象(一個簡單的POJO)來表示用戶對控制器的輸入。然後,您可以使用Spring MVC內置的驗證來確保在命令對象中提供了所有必需的字段。如果該命令通過了驗證,那麼可以通過編程方式將其映射到您的「業務對象」(或使用像Dozer這樣的bean映射庫)。

通過這種方式,您可以處理驗證,不完整的用戶提交等,而無需觸摸或修改任何現有的業務邏輯/規則/服務類別。這使您可以將Web圖層與這些現有圖層分開。

僅供參考,請參閱the MVC tutorial,其中涉及Part 4中的驗證和命令對象。