2010-07-02 56 views
2

我正在尋找最簡單的方法來執行深層副本的平面地圖<字符串,字符串>的嵌套屬性爲bean。一些嵌套屬性是我想爲其提供實例化策略的接口。例如:具有零屬性實例化策略的深豆副本

Map<String, String> customer = new Map<String, String>(); 
customers.put("id", "123"); 
customers.put("address.line1", "221B Baker St."); 

public class Customer { 
    private int id; 
    private Address address; //address is an interface 
    ... getters/setters ... 
} 

請注意,我不想提供顯式映射,只是爲接口提供具體實例的策略。我認爲commons-beanutils可以做到這一點,但他們是一個開放的JIRA門票的功能。具有類似功能的庫是Google GSON,它提供了一個名爲InstanceCreator的接口。

我已經在beanutils之上實現了一個解決方案,但是有沒有一個內置此功能的bean轉換庫?

回答

0

你很好地表達了兩種不同的東西。更容易做的事情就是你似乎最初描述的,深度嵌套的字符串映射。所以

put("id", "1") -> map.put("id", "1") 
put("address.line1", "221b") -> ((Map)map.get("address")).put("221B") 

(我忽視了簡潔的實際安全檢查是地圖上出現,intialize如果是這樣,內容非常重要,他們所有的東西,使我們喜歡做的事情Java的簡潔的方式。)

並把「abcd ..」遞歸地分解爲「。」。

如果您確實需要「地址」。 (因爲你在你的例子中引用了一個Address類)來引用一個Address類型的對象,這有點複雜,你需要一些能夠將前綴識別爲類的東西,最好是自定義響應地圖的東西接口,可以在遍歷樹時輕鬆實例化,並知道如何從輸入字符串創建自己的對象。

我不確定第一個beanutils實現的細節是什麼,寫起來也不難。但是一個嵌套的字符串映射很容易。你可以很容易地用序列化(因爲hashmaps和字符串序列化)或者使用json庫來包裝它,它應該採用一個嵌套的字符串映射,完全沒有問題(谷歌gson很好)。

+0

我根據您的反饋修改了這個問題。我只是想處理一個嵌套屬性的平面地圖。另外,我查看了Google GSON,它具有InstanceCreator的概念,這是我正在尋找的 - 除了我正在使用map - > bean而不是map - > json。 – 2010-07-02 03:41:36

0

我想你可能會讓這個難度超過它。我會做的是序列化和標記或其他格式。我不知道你的要求是什麼,但JAXBXStream,等等所有優秀marshallers做這個。

隨着JAXB,你可以這樣做:

@XmlRootElement(name="customer") 
public class Customer 
{ 
    private int id; 
    private Address address; 
} 

@XmlRootElement(name="address") 
public class Address 
{ 
    private String city; 
} 

並用以下XML:

<customer> 
    <id>1234</id> 
    <address> 
     <city>Kansas City</city> 
    </address> 
</customer> 

...可以被整理並解組來來回回。另外,還有一些在JAXB編組(如球衣,JSON)的其他幾種實現方式,所以你也可以在馬歇爾等格式:

{ 
    "customer": 
    { 
     "id":1234, 
     "address": 
     { 
      "city":"Kansas City" 
     } 
    } 
} 

有你爲什麼需要使用地圖特別的原因?如果不是,那麼只有解決方案是一些複雜的反射實用程序,並且希望像GSON庫這樣的東西可以促進複雜性。

編輯:剛纔看到你不想映射的blurb ......我真的不明白這一點。在使用序列化之後,其他任何類似的方法似乎都不值得。

+0

我正在做一個演示,我已經有了一些必須複製屬性的bean。我已經將數據作爲平面索引圖;它正從文檔存儲中走出來。我當然可以使用JSON,但看到我已經有了其他格式的數據,我只想使用我手邊的數據。當我爲了生產目的而編寫這些代碼時,我可能會完全使用其他一些方法來映射數據。 – 2010-07-02 04:55:52