[JAVA] [Spring] Pièges de BeanUtils.copyProperties

BeanUtils.copyProperties [BeanUtils.copyProperties] pour Spring (https://docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/beans/BeanUtils.html#copyProperties-java.lang.Object-java Il existe une méthode pratique appelée .lang.Object-). C'est une méthode qui copie le contenu d'un champ avec le même nom d'un bean à l'autre. Le premier argument est la source de la copie et le deuxième argument est la destination de la copie. Même si les classes sont différentes, la copie est possible si elles ont le même nom de champ.

** Cours Livre **

public class Book {

    String code;

    String name;

    int price;
}

** Exemple d'utilisation **


Book book1 = new Book();

book1.setCode("A");
book1.setName("Trois Royaumes");
book1.setPrice(500);

Book book2 = new Book();

BeanUtils.copyProperties(book1, book2);

En faisant cela, les valeurs «code», «name» et «price» de «book1» sont copiées dans «book2» dans leur intégralité.

Piège 1: mourir si le nom du champ change lors de la copie vers un objet d'une classe différente

Par exemple, supposons que vous ayez le formulaire et Dto suivants.

Classe ** CreateBookForm **

public class CreateBookForm {

    String code;

    String name;

    int price;
}

** Classe BookDto **

public class BookDto {

    String code;

    String name;

    int price;

    String updateModule;

}

Écrire innocemment BeanUtils.copyProperties (createBookForm, bookDto) dans le mappage Form-> Dto augmentera le taux de mortalité.

Supposons que le nom de champ de «CreateBookForm» passe de «code» à «cd» en raison de la commodité du frontal.

Classe ** CreateBookForm ** (après modification)

public class CreateBookForm {

    String cd;

    String name;

    int price;
}

Cela ne copiera plus cd-> code. C'est parce que les noms de champ sont différents. Ensuite, vous devez changer le nom de champ de BookDto! Il peut y avoir une opinion, mais ce n'est pas cool que les changements se touchent dans la classe préparée pour la séparation des couches.

Lorsque vous utilisez cette méthode, je pense que les principes suivants doivent être respectés.

Piège 2: Une méthode avec le même nom et le même nom existe dans une autre bibliothèque

Cette méthode, avec exactement le même nom, est la [Apache Commons Library](https://commons.apache.org/proper/commons-beanutils/apidocs/org/apache/commons/beanutils/BeanUtils.html#copyProperties-java.lang Il existe dans .Object-java.lang.Object-). De plus, cette méthode, ** le deuxième argument est la source de la copie et le premier argument est la destination de la copie **. L'ordre des arguments est inversé par rapport à celui de Spring du même nom! !! Notez que lors de l'utilisation de l'importation automatique de bibliothèques dans l'EDI, certaines classes peuvent appeler Spring et certaines classes peuvent appeler les copyProperties d'Apache, ce qui peut être inaperçu et créer une dépendance. J'en étais accro.

Personnellement, j'ai une forte impression de "de gauche à droite = du premier argument au deuxième argument" dans "copier la source-> copier la destination", donc j'utilise toujours celui de Spring.

Recommended Posts

[Spring] Pièges de BeanUtils.copyProperties
À propos de DI of Spring ①
À propos de DI of Spring ②
NextInt () → nextLine () pièges
Pièges subtils de Lombok
Les pièges d'Active Hash
Présentation de Spring AOP
Les pièges de JAX-RS WebTarget.queryParam ()
Mémorandum lorsque Spring Boot 1.5.10 → Spring Boot 2.0.0
Spring Framework 5.0 Résumé des principaux changements
Sortie de message (Spring boot)
A propos de la liaison de l'annotation Spring AOP
Filtrer le résultat de BindingResult [Spring]
L'histoire de la rencontre avec l'annotation personnalisée Spring
Après 3 mois de formation Java et Spring
À propos de l'affichage initial de Spring Framework
Résumé de la participation au JJUG CCC 2019 Spring
Mémorandum WebMvcConfigurer de Spring Boot 2.0 (printemps 5)
Fonctionnalités du framework Spring pour les développeurs Java
[Java] [Spring] Tester le comportement de l'enregistreur