Копировать содержимое POJO из одного компонента в другой - PullRequest
9 голосов
/ 09 мая 2011

У меня есть несколько Pojos в разных пакетах, каждый POJO содержит набор другого pojo из того же пакета. Мне нужно скопировать все объекты с одинаковыми именами из пакета Pojos пакета B в объекты пакета A.

Eaxmple:

package com.vanilla.packageA;

public class Student{

    private String firstName;
    private String lastName;
    private Set<Course> course;

    //getters and setters ommited

}   

package com.vanilla.packageA;

    public class Course{
    private String courseName;
    private String courseDescription;

    //seters and getters
}

package com.vanilla.packageB;

public class Student{

    private String firstName;
    private String lastName;
    private Address address;
    private Set<Course> course;
    Private Date birtday;

    //getters and setters ommited

}   

package com.vanilla.packageB;

public class Course{
    private String courseName;
    private String courseDescription;
    private <Lecturer> lecturer;
    private Integer hours;

    //seters and getters
} 

Я хочу рекурсивно копировать все элементы из классов PackageB в классы packageA, которые существуют в PaCkageB и имеют одно и то же имя.

Обновления:

Ребята, я понимаю, что это глупый вопрос, но мне нужно сохранить этот код, теперь код написан так, что они должны вызывать 50 геттеров и сеттеров, или вызывать конструктор с 50 параметрами. К сожалению, я не могу использовать один и тот же объект, и мне нужно его скопировать, но я должен найти более «элегантный» способ копирования бобов tese.

Ответы [ 6 ]

14 голосов
/ 09 мая 2011

Любая причина, почему Apache BeanUtils.copyProperties не работает?

4 голосов
/ 09 мая 2011

Ну .. Бульдозер может быть именно то, что вы ищете.

.,,это структура сопоставления объекта с объектом.Идея состоит в том, что:

  • Обычно это будет отображаться по соглашению.
  • Вы можете переопределить это соглашение с помощью файла сопоставления.

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

При проведении учебных курсов SpringSource мы часто указывали на эту структуру.

3 голосов
/ 13 февраля 2015

См. mapstruct .Этот инструмент генерирует код, поэтому при отражении нет накладных расходов.

1 голос
/ 04 июня 2017

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

public class ObjectCopyTools {

static String[] bases = new String[] {"byte", "short", "int", "long", "float", "double", "char", "boolean"};
static String[] equivalents = new String[] {"Byte", "Short", "Integer", "Long", "Float", "Double", "Character", "Boolean"};

static {

}

private static boolean areEquivalents(String type1, String type2){
    for (int i = 0; i < bases.length; i++) {
        if((type1.equals(bases[i]) && type2.equals(equivalents[i])) 
                || (type2.equals(bases[i]) && type1.equals(equivalents[i]))){
            return true;
        }
    }
    return false;
}

public static <T extends Object, Y extends Object> Y deepReflectionObjectCopy(T origin, Class<Y> resultClass) {
    Class<? extends Object> origClass = origin.getClass();
    Y resultObject = null;
    for (Constructor<?> constructor : resultClass.getConstructors()) {
        if (constructor.getParameterCount() == 0) {
            try {
                resultObject = (Y) constructor.newInstance();
            }catch (InstantiationException | IllegalAccessException | IllegalArgumentException | InvocationTargetException e) {
            }
            break;
        }
    }
    if(resultObject == null){
        return null;
    }
    Field[] origFields = origClass.getDeclaredFields();
    Field[] destFields = resultObject.getClass().getDeclaredFields();

    Object value = null;
    for(Field dstField: destFields){
        try {
            Field tempOrigField = origClass.getDeclaredField(dstField.getName());
            if(tempOrigField.getType().equals(dstField.getType())
                    || areEquivalents(tempOrigField.getType().getSimpleName(), dstField.getType().getSimpleName())){
                dstField.set(resultObject, tempOrigField.get(origin));
            }
        } catch (NoSuchFieldException | SecurityException | IllegalArgumentException | IllegalAccessException e) {
        }
    }
    return resultObject;
}

Надеюсь, эта помощь.

0 голосов
/ 05 апреля 2019

Если у вас уже есть зависимости пружин, вы можете использовать org.springframework.beans.BeanUtils

BeanUtils.copyProperties(from, to);
0 голосов
/ 09 мая 2011

Если DRY является базовым принципом информатики, какую причину вы можете указать для двух идентичных параллельных графов объектов? Мало того, что вы удвоили свое бремя обслуживания, но теперь вам нужно разработать рекурсивный метод, чтобы ничего не делать, кроме как переправлять данные из одного в другое.

...