簡體   English   中英

將 POJO 內容從一個 bean 復制到另一個 bean

[英]Copy POJO content from one bean to another

我在不同的包中很少有 Pojo,每個 POJO 都包含來自同一包的另一個 pojo 的集合。 我需要將包 B Pojos 中的所有同名項目復制到包 A 中的對象。

例如:

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類中的所有項目復制到存在於PaCkageB並共享相同名稱的packageA類。

更新:

伙計們,我知道這是一個愚蠢的問題,但我需要維護這段代碼,現在代碼的編寫方式是他們必須調用 50 個 getter 和 setter,或者調用帶有 50 個參數的構造函數。 不幸的是,我不能使用同一個對象,我需要復制它,但我必須找到更“優雅”的方式來復制 tese beans。

Apache BeanUtils.copyProperties不起作用的任何原因?

嗯..推土機可能正是您正在尋找的東西。

. . . 它是一個對象到對象映射框架。 這個想法是:

  • 通常它會按慣例映射。
  • 您可以使用映射文件覆蓋此約定。

. . 因此映射文件盡可能緊湊。 它在許多情況下很有用,例如將用例指定的服務有效負載映射到可重用的核心模型對象上。

在提供 SpringSource 培訓課程時,我們曾經經常指出這個框架。

請參閱mapstruct 該工具生成代碼,因此沒有反射開銷。

如果您已經有 spring 依賴項,則可以使用org.springframework.beans.BeanUtils

BeanUtils.copyProperties(from, to);

幾乎每個項目都需要復制字段值,例如執行 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;
}

希望這有幫助。

使用 PropertyUtils,您可以復制 onky 非空屬性,如下所示:

    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());
        }

    }

如果 DRY 是計算機科學的基本原理,那么您可以為兩個相同的平行對象圖給出什么理由? 您不僅使維護負擔增加了一倍,而且現在您必須開發一種遞歸方法,除了將數據從一個傳輸到另一個之外什么都不做。

你試過使用BULL嗎? 您可以在DZone上找到有關如何使用它的指南。 它提供了在應對時也執行對象轉換的可能性。 此外,它遞歸地執行復制,不需要定義 getter 和 setter。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM