Java如何将两个DTO合并成一个

在Java中,DTO(Data Transfer Object)用于在不同层之间传输数据。有时候我们需要将两个DTO合并成一个,以便在应用程序的不同部分使用。下面将详细介绍如何实现这个功能。

方案一:使用BeanUtils.copyProperties()

一个简单而常用的方法是使用BeanUtils类提供的copyProperties()方法。这个方法能够将一个对象的属性复制到另一个对象中,通过遍历源对象的属性来实现。

import org.springframework.beans.BeanUtils;

public class DTOUtils {
    public static void mergeDTOs(Object source1, Object source2, Object target) {
        BeanUtils.copyProperties(source1, target);
        BeanUtils.copyProperties(source2, target);
    }
}

使用示例:

public class Main {
    public static void main(String[] args) {
        DTO1 dto1 = new DTO1("John", 20);
        DTO2 dto2 = new DTO2("Doe", "john.doe@example.com");
        
        MergedDTO mergedDTO = new MergedDTO();
        DTOUtils.mergeDTOs(dto1, dto2, mergedDTO);
        
        System.out.println(mergedDTO.getName());  // 输出:John
        System.out.println(mergedDTO.getAge());   // 输出:20
        System.out.println(mergedDTO.getEmail()); // 输出:john.doe@example.com
    }
}

方案二:手动合并属性

如果你希望更加灵活地控制属性的合并过程,可以手动遍历两个DTO的属性,并将它们的值赋给目标DTO对象。

public class DTOUtils {
    public static void mergeDTOs(DTO1 dto1, DTO2 dto2, MergedDTO mergedDTO) {
        mergedDTO.setName(dto1.getName());
        mergedDTO.setAge(dto1.getAge());
        mergedDTO.setEmail(dto2.getEmail());
    }
}

使用示例同方案一。

类图

下面是本文所涉及的类的类图:

classDiagram
    class DTO1 {
        -name: String
        -age: int
        +getName(): String
        +getAge(): int
        +setName(name: String): void
        +setAge(age: int): void
    }

    class DTO2 {
        -email: String
        +getEmail(): String
        +setEmail(email: String): void
    }

    class MergedDTO {
        -name: String
        -age: int
        -email: String
        +getName(): String
        +getAge(): int
        +getEmail(): String
        +setName(name: String): void
        +setAge(age: int): void
        +setEmail(email: String): void
    }

    class DTOUtils {
        +mergeDTOs(source1: Object, source2: Object, target: Object): void
    }

    DTO1 --|> DTOUtils
    DTO2 --|> DTOUtils
    MergedDTO --|> DTOUtils

以上是将两个DTO合并成一个的两种方法及其示例。根据实际需求,你可以选择合适的方法来实现DTO的合并。