Преобразовать java.util.Set объекта <key, value> в простой объект pojo - PullRequest
0 голосов
/ 05 июля 2018

Получение java.util.Set объектов, которые имеют в качестве входных данных только пары ключ-значение, как показано ниже

public class KeyValueObject {
String key;
String value;

// good old constructor, setters and getters

}

Входной объект: java.util.Set inputObject;

KeyValuePair pair1 = new KeyValuePair("Name":"John");
KeyValuePair pair2 = new KeyValuePair("Age":"28");
KeyValuePair pair3 = new KeyValuePair("Location":"Cincinnati");

inputObject.add(pair1);
inputObject.add(pair2);
inputObject.add(pair3);

С помощью «inputObject» в качестве входящего запроса, как преобразовать его в простой объект POJO, который имеет все ключи, описанные выше, как отдельные параметры, как показано ниже:

Public class SimplePojoObject {
    private String name;
    private String age;
    private String location;

  // Good old setters and getters

}

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

Ответы [ 2 ]

0 голосов
/ 05 июля 2018

Самый простой способ - написать небольшой метод, который вызывает сеттеры:

public SimplePojoObject buildSimplePojoObject(Set<KeyValuePair> properties) {
    SimplePojoObject result = new SimplePojoObject();
    for (KeyValuePair prop : properties) {
        switch (prop.getKey()) {
            case "Name":
                result.setName(prop.getValue());
                break;
            case "Age":
                result.setAge(prop.getValue());
                break;
            case "Location":
                result.setLocation(prop.getValue());
                break;
            default:
                // Throw an exception or ignore it.
                throw new IllegalArgumentException("Unknown property "+ prop.getKey());
        }
    }
    return result;
}

Но если вы хотите сделать это динамически, вы наверняка могли бы:

public SimplePojoObject buildSimplePojoObject(Set<KeyValuePair> properties) {
    SimplePojoObject result = new SimplePojoObject();
    Lookup l = MethodHandles.publicLookup();
    MethodType mt = MethodType.methodType(void.class, String.class);
    for (KeyValuePair prop : properties) {
        MethodHandle mh = l.findVirtual(SimplePojoObject.class, "set" + prop.getKey());
        try {
            mh.invokeExact(result, prop.getValue());
        } catch (Error | RuntimeException e) {
            throw e;
        } catch (Throwable t) {
            // MethodHandle.invokeExact is declared to throw Throwable, so we have to catch it.
            throw new RuntimeException(e);
        }
    }
    return result;
}
0 голосов
/ 05 июля 2018

Вы можете сделать это так:

  • Преобразование Set<KeyValueObject> в JsonNode (или Map<String, String>) объект.
  • Преобразование сгенерированного JsonNode (или Map<String, String>) объекта в SimplePojoObject с использованием ObjectMapper (вы также можете использовать библиотеку Gson вместо ObjectMapper)

Если у вас уже есть Map<String, String> объект вместо Set<KeyValueObject>, тогда вы можете сделать это в одну строку:

SimplePojoObject simplePojoObject = new ObjectMapper().convertValue(map, SimplePojoObject.class);
...