Как преобразовать карту с плоскими свойствами (prop1.prop2.prop3) в POJO

У меня есть следующий вариант использования:

У меня есть карта со свойствами:

Map <String, String[]> args = new HashMap(){{
put("requester.firstName", "Alice");
put("requester.lastName", "Smith");
put("requester.address", "Glasgow Av");
put("publication.type", "print");
put("publication.subtype", "book");
}};

Мне нужно преобразовать его в этот pojo

public class WebRequest{
private Requester requester;
private Publication publication;
}

class Requester{
private String firstName;
private String lastName;
private String address;
}

class Publication{
private String type;
private String subType;
}

Могу ли я использовать Джексона, чтобы запустить преобразование? Если нет, то какая библиотека лучше всего подходит для этого?

Спасибо,

Надя


person Nadja    schedule 07.04.2016    source источник


Ответы (2)


Возможно, вы сможете использовать BeanUtils apache common. Этот фреймворк способен почти мгновенно отображать Map в bean-компонент.

Map<String,String> yourMap = new HashMap<String,String>();
yourMap.put("name", "Joan");
yourMap.put("age", "30");

YourBean p = new YourBean();

try {
    BeanUtils.populate(p, yourMap);
}  catch (Throwable e) {
    //do something...
}

В чем я не уверен, так это в том, распознает ли он автоматически вложенные объекты и соответствующие свойства, но, возможно, вы можете выполнить это деление вручную (предложив 2 карты и т. д.).

Дополнительную информацию можно найти здесь BeanUtils

person uniknow    schedule 07.04.2016

Я нашел здесь, на StackOverflow, отличное решение для моей проблемы. Аналогичная проблема,
BeanUtils преобразует java.util.Map во вложенный компонент

Один из ответов был идеальным:

Вы должны использовать класс Spring BeanWrapper. Он поддерживает вложенные свойства и может создавать для вас внутренние компоненты:

BeanOne one = new BeanOne();
BeanWrapper wrapper = PropertyAccessorFactory.forBeanPropertyAccess(one);
wrapper.setAutoGrowNestedPaths(true);

Map<String, Object> map = new HashMap<>();
map.put("fieldOne", "fieldOneValue");
map.put("fieldTwo.fieldOne", "fieldOneValue");

wrapper.setPropertyValues(map);

assertEquals("fieldOneValue", one.getFieldOne());
BeanTwo two = one.getFieldTwo();
assertNotNull(two);
assertEquals("fieldOneValue", two.getFieldOne();

Я надеюсь, что это поможет кому-то с подобной проблемой.

person Nadja    schedule 14.04.2016