2010-07-02 2 views
2

Я ищу простейший способ сделать глубокую копию плоской карты < String, String > вложенных свойств для компонента. Некоторые вложенные свойства - это интерфейсы, для которых я хотел бы предоставить стратегию для создания экземпляра. Например:Копию глубокой фасоли со стратегией для создания нулевого свойства

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") 

(я игнорирую для краткости фактических проверок безопасности как для карты там, инициализировать если да, то ядд ядд, они все вещи, которые делают нас любят лаконичный способ Явы делать вещи.)

и поставить «abcd ..», просто рекурсивно сверлит вниз по «.».

Если вы действительно хотите «адрес». (поскольку вы ссылаетесь на класс Address в своем примере), чтобы ссылаться на объект типа Address, это немного сложнее, вам понадобится что-то, что распознает префикс как класс, желательно что-то обычное, которое отвечает на карту интерфейс, может быть легко инстанцирован при движении по дереву и знает, как создавать объекты из самих строк ввода.

Я не уверен в деталях реализации beanutils первого, это не так сложно написать. Но вложенная карта строк проста. Вы можете легко упаковать это с сериализацией (с сериализации hashmaps и строк) или с помощью библиотеки json, которая должна иметь вложенную карту строк без каких-либо проблем (google gson работает хорошо).

+0

Я немного изменил вопрос на основе ваших отзывов. Я только пытаюсь разобраться с плоской картой вложенных свойств. Кроме того, я посмотрел на Google GSON, и у него есть концепция InstanceCreator, которую я ищу - за исключением того, что я собираюсь map -> bean вместо map -> json. –

0

Думаю, вы можете сделать это сложнее, чем могло бы быть. Я бы сделал сериализацию в и из разметки или в другом формате. Я не уверен, что ваши требования, но JAXB, XStream и т. Д. Все превосходные маршаллеры, чтобы сделать именно это.

С 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> 

... может быть ранжированы и unmarshalled взад и вперед. Кроме того, есть несколько других реализаций ИАСА JAXB (например, джерси-JSON), так что вы можете также маршал в других форматах:

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

Есть ли конкретная причина, почему вы должны использовать карту? Если нет, вы только разрешение - это сложная утилита Reflections, и, надеюсь, что-то вроде библиотеки GSON может облегчить сложность.

Редактировать: только что увидели вашу рекламу о том, что вам не нужны сопоставления ... Я этого не понимаю.После использования сериализации любой другой способ сделать что-то подобное кажется нецелесообразным.

+0

Я работаю над демо, где у меня уже есть несколько компонентов, на которые я должен скопировать свойства. У меня уже есть данные как плоская индексированная карта; он выходит из хранилища документов. Я могу, конечно, использовать JSON, но, видя, как у меня уже есть данные в другом формате, я хочу просто использовать данные, которые у меня были под рукой. Когда я пишу это для производственных целей, я, вероятно, буду использовать какой-либо другой метод для сопоставления данных. –