[JAVA] [Frühling] Fallstricke von BeanUtils.copyProperties

BeanUtils.copyProperties Für den Frühling [BeanUtils.copyProperties](https://docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/beans/BeanUtils.html#copyProperties-java.lang.Object-java Es gibt eine bequeme Methode namens .lang.Object-). Es ist eine Methode, die den Inhalt eines Feldes mit demselben Namen von einer Bean in die andere kopiert. Das erste Argument ist die Kopierquelle und das zweite Argument ist das Kopierziel. Selbst wenn die Klassen unterschiedlich sind, ist das Kopieren möglich, wenn sie denselben Feldnamen haben.

** Buch Klasse **

public class Book {

    String code;

    String name;

    int price;
}

** Anwendungsbeispiel **


Book book1 = new Book();

book1.setCode("A");
book1.setName("Drei Königreiche");
book1.setPrice(500);

Book book2 = new Book();

BeanUtils.copyProperties(book1, book2);

Auf diese Weise werden die Werte "Code", "Name" und "Preis" von "Buch1" vollständig in "Buch2" kopiert.

Fallstricke 1: Stirb, wenn sich der Feldname beim Kopieren in ein Objekt einer anderen Klasse ändert

Angenommen, Sie haben das folgende Formular und Dto.

** CreateBookForm ** Klasse

public class CreateBookForm {

    String code;

    String name;

    int price;
}

** BookDto ** Klasse

public class BookDto {

    String code;

    String name;

    int price;

    String updateModule;

}

Das unschuldige Schreiben von "BeanUtils.copyProperties (createBookForm, bookDto)" in das Mapping "Form-> Dto" erhöht die Sterblichkeitsrate.

Angenommen, der Feldname von "CreateBookForm" wird aufgrund der Benutzerfreundlichkeit des Frontends von "Code" in "CD" geändert.

** CreateBookForm ** Klasse (nach Änderung)

public class CreateBookForm {

    String cd;

    String name;

    int price;
}

Dadurch wird "cd-> code" nicht mehr kopiert. Dies liegt daran, dass die Feldnamen unterschiedlich sind. Dann sollten Sie den Feldnamen von "BookDto" ändern! Es mag eine Meinung geben, aber es ist nicht cool, dass sich die Änderungen in der für die Schichttrennung vorbereiteten Klasse gegenseitig beeinflussen.

Bei der Verwendung dieser Methode sollten meines Erachtens die folgenden Grundsätze eingehalten werden.

Fallstrick 2: In einer anderen Bibliothek existiert eine Methode mit demselben Nachnamen und demselben Namen

Diese genau gleichnamige Methode ist die Apache Commons Library Es existiert in .Object-java.lang.Object-). Darüber hinaus ist bei dieser Methode ** das zweite Argument die Kopierquelle und das erste Argument das Kopierziel **. Die Reihenfolge der Argumente ist umgekehrt zu der von Spring mit dem gleichen Namen! !! Beachten Sie, dass bei Verwendung des automatischen Bibliotheksimports in der IDE einige Klassen möglicherweise Spring aufrufen und einige Klassen möglicherweise Apaches copyProperties aufrufen, was unbemerkt und süchtig machen kann. Ich war süchtig danach.

Persönlich habe ich einen starken Eindruck von "von links nach rechts = vom ersten Argument zum zweiten Argument" in "Quelle kopieren-> Ziel kopieren", daher verwende ich immer das von Spring.

Recommended Posts

[Frühling] Fallstricke von BeanUtils.copyProperties
Über DI des Frühlings ①
Über DI des Frühlings ②
Fallstricke von NextInt () → nextLine ()
Subtile Fallstricke von Lombok
Die Fallstricke von Active Hash
Übersicht über Spring AOP
Die Fallstricke von JAX-RS WebTarget.queryParam ()
Memorandum beim Spring Boot 1.5.10 → Spring Boot 2.0.0
Spring Framework 5.0 Zusammenfassung der wichtigsten Änderungen
Nachricht erlöschen (Spring Boot)
Über das Binden der Spring AOP Annotation
Filtern Sie das Ergebnis von BindingResult [Spring]
Die Geschichte der Begegnung mit Spring Custom Annotation
Nach 3 Monaten Java- und Frühlingstraining
Informationen zur ersten Anzeige von Spring Framework
Zusammenfassung der Teilnahme am JJUG CCC 2019 Spring
WebMvcConfigurer-Memorandum von Spring Boot 2.0 (Spring 5)
Funktionen des Spring Frameworks für Java-Entwickler
[Java] [Spring] Testen Sie das Verhalten des Loggers