DTO-Muster: Die beste Methode zum Kopieren von Eigenschaften zwischen zwei Objekten
In meine Anwendung-Architektur, die ich versenden in der Regel das Objekt oder Liste von Objekten, die von der data access layer, web-layer über die service-Schicht, in dem diese Objekte sich von einem DAO Objekt zu einem DTO Objekt und Umgekehrt. Die web-Schicht haben keinen Zugang zu DAO-Objekte und die DAO-Schicht, verwenden Sie keine DTOs.
Zu demonstrieren, Schreibe ich normalerweise den code wie:
@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;
}
Hier der Benutzer ist der Datenbank-Entität:
@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;
}
}
- Und dies ist die 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;
}
}
Also ich Frage mich, ob dies ist der einzige Weg, um kopieren von Eigenschaften zwischen zwei Objekten. Ich denke, ich bin nicht sicher. Auch ich bin mit lambdajso gibt es eine Methode, die in dieser API, die ich kopieren kann, alle diese Eigenschaften zu erstellen, die Liste mit den anderen Objekten?
Thema klingt subjektiv, aber ich möchte wirklich von dir wissen, Experten die Möglichkeiten, mit denen die transformation des Objekts von einer form zur anderen getan werden kann, wo die maximale Anzahl Felder haben dieselbe Zeichenfolge.
InformationsquelleAutor der Frage Tapas Bose | 2013-02-27
Du musst angemeldet sein, um einen Kommentar abzugeben.
Können Sie einen Blick auf dozer das ist ein
Noch eine bessere link...
InformationsquelleAutor der Antwort pgras
Können Sie Apache Commmons Beanutils. Die API ist
org.apache.commons.beanutils.PropertyUtilsBean.copyProperties(Object dest, Object orig)
.Kopiert Eigenschaftswerte aus der "Herkunft" bean-der "destination" - bean für alle Fälle, in denen die Eigenschaftsnamen sind die gleichen.
Jetzt werde ich off-topic. Mit DTO meist als ein anti-pattern in EJB3. Wenn Ihre DTO Ihren domain-Objekte sind sehr gleich, es gibt wirklich keine Notwendigkeit, um doppelte codes. DTO noch hat Verdienste, vor allem für die Netzwerk-Bandbreite zu sparen, während die remote-access-beteiligt ist. Ich habe keine details über Ihre Anwendung-Architektur, aber wenn die Ebenen, die Sie gesprochen sind die logischen Ebenen und nicht über Netzwerk, ich sehe nicht die Notwendigkeit für DTO.
InformationsquelleAutor der Antwort Lan
Hatte ich eine Anwendung, die ich brauchte, um die Konvertierung von JPA Person DTO, und ich dachte darüber nach und kam schließlich mit
org.springframework.beans.BeanUtils.copyProperties
für das kopieren einfache Eigenschaften und auch die Erweiterung und Verwendungorg.springframework.binding.convert.service.DefaultConversionService
für die Umwandlung von komplexen Eigenschaften.Im detail mein Dienst war so etwas wie dieses:
InformationsquelleAutor der Antwort Reza
Wäre nicht lambdaj ist projektfunktion tun, was du suchst?
Werde es in etwa so Aussehen:
(Definieren Sie den Konstruktor für UserDTO entsprechend...)
Siehe auch hier für Beispiele...
InformationsquelleAutor der Antwort Ashkan Aryan
Können Sie mithilfe von reflektion finden Sie alle
get
Methoden in Ihrem DAO Objekte und rufen Sie den Gegenwertset
Methode in der DTO. Dies wird nur funktionieren, wenn alle solche Methoden existieren. Es sollte leicht zu finden sein Beispiel-code für diese.InformationsquelleAutor der Antwort Skip Head
Schlage ich vor, Sie sollten verwenden Sie eine der Kartografen Bibliotheken: MapstructModelMapperetc.
Mit Mapstruct die mapper Aussehen wird:
Das Reale Objekt mit allen Getter und setter werden automatisch erzeugt, von dieser Schnittstelle. Sie können es verwenden, wie:
Können Sie auch hinzufügen, einige Logik für die activeText eingereicht mit @AfterMapping annotation.
InformationsquelleAutor der Antwort Anton Orlov