2013-09-30 77 views
4

比方說,我們有一個大型的Web項目,使用Spring 3.2.4,Hibernate 3.6.10等超過100個實體。此項目中的大多數控制器都是基於REST的,並將通過JavaScript調用。實現DTO/ViewModels for Large應用程序的Spring MVC最佳實踐?

雖然我認爲從概念上來說簡單地將編組/實體直接編組到視圖中會更簡單,但實際上這在使用Jackson時非常糟糕。儘管可以使用@JsonIgnore來避免無限循環,但有時候這種「一刀切」的註釋對整個應用程序來說並不適用 - 有時候我需要一個解剖刀,而且很多時候可以查看一個對象在許多方面。

另外,儘管使用Hibernate模塊爲Jackson解決了使用Hibernate時遇到的問題,但仍然會遇到一些使用Spring MVC測試框架時的初始化問題javaassist

所有這些上述問題都可以通過簡單地使用ViewModelsDTOs來避免,所以這就是我所傾向的方向。不幸的是,創建和維護超過100個DTO以及映射到和來自的代碼是相當的投資。

我也猜測我必須爲這些DTO中的每一個編寫自定義的JsonDeserializer類,這也是相當多的編碼和測試。

最後,我不確定這是否明智,但我懷疑我的驗證規則將從我的實體移到我的視圖模型上。我可能永遠不會真的需要驗證我的實際實體,但這種方法讓我感到緊張。

有人可以強調一些在這樣的項目中實施和映射DTOs的最佳實踐,並且也提供一些關於交付Deserializion的最佳方式的見解嗎?我正在尋找能夠輕鬆維護代碼的實踐,並希望不會耗費大量人力和時間。 Martin Fowler的彙編程序對我來說有點多。謝謝!

回答

3

通常,至少在更大的應用程序中是我的經驗,我們在屏幕上顯示的內容與實際的業務組件不同(模型化)不同。你基本上想要的是一個閱讀和寫作的不同領域(CQRS也許是一種方式)。

這是不可能創建搜索,報告,並利用處理事務的單一模式(Greg Young的)

發生了什麼,我在過去的工作是,創造一個最佳的解決方案數據庫視圖對於那些截然不同的屏幕/模型,並簡單地在這些視圖上實現另一個hibernate實體(只讀)。確保您可以與您想要調用的實際業務邏輯關聯回原始業務實體。

如果這也有點多,你可能想看看Dozer,它可以幫助你映射到/到對象。通過這種方式,您可以在Java中維護轉換邏輯,而無需自己編寫所有映射邏輯(您仍需要對其進行配置,但這可能不那麼痛苦)。

鏈接

  1. CQRS
  2. CQRS文獻pdf
  3. Dozer
+0

甲CQRS爲Java:[Qi4j](http://qi4j.org/) – nobeh