Wzór DTO: Najlepszy sposób kopiowania właściwości między dwoma obiektami

W architekturze mojej aplikacji zazwyczaj przesyłam obiekt lub listę obiektów z warstwy dostępu do danych do warstwy internetowej za pośrednictwem warstwy usług, w której obiekty te są przekształcane zDAO sprzeciwić sięDTO obiekt i odwrotnie. Warstwa internetowa nie ma dostępu do obiektów DAO, a warstwa DAO nie używa DTO.

Aby to wykazać, zazwyczaj piszę kod jako:

@Transactional(readOnly = true)
public List<UserDTO> getAllUserAsUserDTO() {
    List<UserDTO> userDTOs = new ArrayList<UserDTO>();

    for(User user : getAllUser()) {
        userDTOs.add(constructUserDTO(user));
    }

    return userDTOs;
}

private UserDTO constructUserDTO(User user) {
    UserDTO userDTO = new UserDTO();
    userDTO.setFullName(user.getFullName());
    userDTO.setId(user.getId());
    userDTO.setUsername(user.getUsername());
    userDTO.setRole(user.getRole());
    userDTO.setActive(user.isActive());
    userDTO.setActiveText(user.isActive() ? "Active" : "Inactive");
    return userDTO;
}

Tutaj użytkownik jest jednostką bazy danych:

@javax.persistence.Entity
@Table(name = "USER")
public class User extends Entity {

    @Transient
    private static final long serialVersionUID = -112950002831333869L;

    private String username;
    private String fullName;
    private boolean active;
    private String role;
    // other fields

    public User() {
        super();
    }

    @NaturalId
    @Column(name = "USERNAME", nullable = false)
    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    @Column(name = "FULL_NAME")
    public String getFullName() {
        return fullName;
    }

    public void setFullName(String fullName) {
        this.fullName = fullName;
    }

    @Column(name = "ACTIVE", nullable = false)
    public boolean isActive() {
        return active;
    }

    public void setActive(boolean active) {
        this.active = active;
    }

    @Column(name = "ROLE")
    public String getRole() {
        return role;
    }

    public void setRole(String role) {
        this.role = role;
    }
}

A to jest UserDTO:

public class UserDTO extends BaseDTO {

    private static final long serialVersionUID = -3719463614753533782L;

    private String username;
    private String fullName;
    private String role;
    private String activeText;
    private Boolean active;
    //other properties

    public UserDTO() {
        super();
    }

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public String getFullName() {
        return fullName;
    }

    public void setFullName(String fullName) {
        this.fullName = fullName;
    }

    public String getRole() {
        return role;
    }

    public void setRole(String role) {
        this.role = role;
    }

    public String getActiveText() {
        return activeText;
    }

    public void setActiveText(String activeText) {
        this.activeText = activeText;
    }

    public Boolean getActive() {
        return active;
    }

    public void setActive(Boolean active) {
        this.active = active;
    }
}

Zastanawiałem się, czy to jedyny sposób kopiowania właściwości między dwoma obiektami. Chyba nie jestem pewien. Również używamlambdaj, więc czy w tym interfejsie API istnieje metoda, dzięki której mogę skopiować wszystkie te właściwości, aby utworzyć listę innych obiektów?

Ten temat może być dźwiękiem subiektywnym, ale naprawdę chcę wiedzieć od ekspertów, w jaki sposób można dokonać transformacji obiektu z jednej postaci do drugiej, gdzie maksymalne pola mają ten sam ciąg.

questionAnswers(4)

yourAnswerToTheQuestion