2008-12-17 139 views
6

在我們的項目中,我們必須將一個bean的嵌套結構映射到另一個上。 (這些實際上是JAXB映射的Java文檔的Java表示形式,例如表示傳入的訂單文檔。)這必須映射到另一個系統完全不同的訂單文檔結構上。如何將不同的Java-Bean結構映射到另一個上

有什麼選擇可以做到這一點?我寧願東西,滿足以下要求:

  1. 映射應該提醒我,當一個領域的映射沒有定義
  2. 映射應該有一些默認值,比如等於名稱字段映射到彼此爲String提供標準映射,比如int,反之亦然。
  3. 映射應該是雙向的。
  4. 定義映射時應該能夠使用代碼完成。

對此有希望的框架是Dozer,但它不滿足1和4.與JBeanMapper相同。只需在Java中進行編程就可以做到4,而不是其他要求;使用XSLT可能實現2個,但沒有別的。你有更好的想法嗎?

回答

1

當我們遇到這個問題時,我們最終在一個工具類中使用Java進行字段映射。這是一個很麻煩的問題,尤其是當你需要映射到幾個不同的Web服務,並且必須爲每個Web服務編寫映射(其中一些是有名稱屬性的簡單2D映射而不是對象的層次結構時,呼叫)。

但是,通過這種方式,您有能力分析映射目標的要求以獲得最佳質量映射,設置數據未設置的默認值等。你可以在你需要的映射器中拋出一個自定義的「UndefinedMappingException」。而且,由於不是一個使用反射和/或複雜的XML映射配置文件的蓬鬆庫,所以它更快。

也就是說,這篇文章主張「用Java編寫」。

1

我解決了與commons-beanutils類似的問題。

我的最終目標是構建數據結構的大型Java文件,並且映射器爲我創建了該文件。這樣,我可以從程序運行時創建的快照創建測試數據。

映射器允許定義排序對象的鍵,這是用於在Java文件中生成對象名稱的字段,我使用了一個帶有「class:field」作爲鍵的映射。該值是實現簡單「映射」接口的對象(一種方法:toJava(對象實例,字符串字段,對象值))。

我的主要問題是編譯2MB + Java文件:)

0

有一個有趣的解決方案,它可以幫助你,如果你映射的是有許多略有不同的變體的數據結構。例如,如果您正在爲不同的業務案例和產品變型建模業務訂單結構,並且不同的變體需要不同的組合,例如地址,賬戶ID,產品的配置信息等相同屬性。

因此,您有許多結構類似的bean包含許多屬性的不同子集。如果您不想爲每個變體編寫代碼,則可以引入具有發生在這些Bean中的所有屬性的Java接口,並使用java.lang.reflect.Proxy爲要映射的bean構建代理實例,併爲其返回null getters實際的bean沒有/拋出異常,如果在實際的bean上調用一個不存在的setter。用一種說法,你將一個接口注入那些擁有比bean本身更多方法的bean中。

1

Transmorph,EZMorph,Dozer,OTOM是你可以在Bean to Bean映射中看到的一些東西。 過去我曾經使用過推土機,並感覺它已經長年保持穩定。

5

ModelMapper是符合您所有標準的圖書館之一。它提供了一個使用實際代碼來映射屬性的映射API,因此您可以完成代碼。它提供驗證以確保所有目標屬性都被映射。此外,它提供了一些事情,你甚至不知道你想要的,如智能映射:)

退房的ModelMapper主頁瞭解更多信息:

http://modelmapper.org

2

另一種方法是MapStruct它在生成映射代碼編譯時間,導致類型安全的映射,在運行時不需要任何依賴(聲明:我是MapStruct的作者)。

1

看看GeDA在運行時使用字節碼創建映射類,這使得它非常快速http://genericdtoassembler.org/。它將涵蓋第1-3點。關於第4點,我會想象它是一個IDE的東西,所以我不認爲你會找到任何可以促進它的庫,除非它有IDE插件。