将POJO内容从一个bean复制到另一个bean

时间:2011-05-09 13:30:43

标签: java apache-commons

我在不同的包中有很少的Pojos,每个POJO包含来自同一个包的另一个pojo的集合。我需要将Package B Pojos中具有相同名称的所有项目复制到Package 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个getter和setter,或者调用50个参数的构造函数。 不幸的是,我不能使用相同的对象,我需要复制它,但我必须找到更“优雅”的方式来复制tese bean。

8 个答案:

答案 0 :(得分:14)

Apache BeanUtils.copyProperties无效的原因是什么?

答案 1 :(得分:4)

嗯.. Dozer可能只是你正在寻找的东西。

。 。 。它是对象映射框架的对象。这个想法是:

  • 通常它会按照惯例进行映射。
  • 您可以使用映射文件覆盖此约定。

。 。因此映射文件尽可能紧凑。它对许多情况很有用,例如将用例指定服务有效负载映射到可重用的核心模型对象。

在提供SpringSource培训课程时,我们经常指出这个框架。

答案 2 :(得分:3)

mapstruct。这个工具生成代码,因此反射没有任何开销。

答案 3 :(得分:1)

复制字段值几乎是每个项目的需要,例如对于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;
}

希望得到这个帮助。

答案 4 :(得分:0)

如果DRY是计算机科学的基本原则,你可以给出两个相同的平行对象图的原因是什么?您不仅增加了维护负担,而且现在您必须开发一种递归方法,除了将数据从一个传送到另一个之外什么都不做。

答案 5 :(得分:0)

如果您已经具有spring依赖项,则可以使用org.springframework.beans.BeanUtils

BeanUtils.copyProperties(from, to);

答案 6 :(得分:0)

使用PropertyUtils,您可以按如下方式复制onky非null属性:

    private void copyNonNullProperties(Object destination,
            Object source) {
        try {
            PropertyUtils.describe(source).entrySet().stream()
                    .filter(source -> source.getValue() != null)
                    .filter(source -> !source.getKey().equals("class"))
                    .forEach(source -> {
                        try {
                            PropertyUtils.setProperty(destination, source.getKey(), source.getValue());
                        } catch (Exception e22) {
                            log.error("Error setting properties : {}", e22.getMessage());
                        }
                    });

        } catch (Exception e1) {
            log.error("Error setting properties : {}", e1.getMessage());
        }

    }

答案 7 :(得分:0)

您是否尝试过使用BULL?您可以在DZone上找到有关如何使用它的指南。它提供了在应对时也可以执行对象转换的可能性。 而且,它可以递归执行复制,不需要定义getter和setter。