[JAVA] Effectuer une cartographie de bean à grande vitesse à l'aide de MapStruct

http://mapstruct.org/ MapStruct est une bibliothèque qui vise à effectuer le Bean Mapping facilement et à grande vitesse en générant automatiquement du code au moment de la compilation en utilisant les informations d'annotation définies dans la classe comme un indice à l'aide d'un mécanisme appelé Annotation Processor.

La bibliothèque est également présentée dans Awesome Java (https://github.com/akullpp/awesome-java/blob/master/README.md#bean-mapping), mais elle produit du code statique et solide au moment de la compilation. J'utilise ceci sur le site de développement parce que l'approche de pouvoir le faire correspond à mon cas d'utilisation personnel et il est utilisé dans des outils tels que Swagger.

Bonjour le monde

J'ai l'impression que c'est un slapstick, mais allons-y.

En écrivant ce qui suit, la quantité de code écrit par des humains peut être réduite autant que possible, et le mappage de haricots peut être réalisé à grande vitesse (plus rapide que la réflexion, etc.) par le code généré automatiquement. Ne vous inquiétez pas du contenu de la classe car il n'a pas de signification particulière.

//BeanA (Sada)
import lombok.Data;

@Data
public class Sada {
	String name;
	int age;
	double score;
}
//BeanB (Masashi)
import lombok.Data;

@Data
public class Masashi {
	String title;
	int age;
}
//BeanMapper
import org.mapstruct.Mapper;
import org.mapstruct.Mapping;
import org.mapstruct.factory.Mappers;

@Mapper
public interface SadaMapper {
	SadaMapper INSTANCE = Mappers.getMapper(SadaMapper.class);

	@Mapping(source = "name", target = "title")
	Masashi sadaToMasashi(Sada sada);
}
//Test
import static org.assertj.core.api.Assertions.assertThat;
import static org.hamcrest.CoreMatchers.is;
import static org.junit.Assert.*;

import org.junit.Test;

public class SadaMapperTest {

	@Test
	public void test() {
		Sada sada = new Sada() {
			{
				setName("masashi");
				setAge(65);
				setScore(Double.MAX_VALUE);
			}
		};
		Masashi masashi = SadaMapper.INSTANCE.sadaToMasashi(sada);

	    assertThat(masashi.getTitle(), is(sada.getName()));
	    assertThat(masashi.getAge(), is(sada.getAge()));
	}
}

Generated Source MapStruct générera automatiquement une classe d'implémentation si vous décrivez l'interface selon le format spécifié. Si vous jetez un coup d'œil au décrypteur pour voir quel type de source est réellement généré automatiquement en fonction du code ci-dessus, la source suivante est générée.


public class SadaMapperImpl
  implements SadaMapper
{
  public Masashi sadaToMasashi(Sada sada)
  {
    if (sada == null) {
      return null;
    }
    Masashi masashi = new Masashi();
    
    masashi.setTitle(sada.getName());
    masashi.setAge(sada.getAge());
    
    return masashi;
  }
}

Comment utiliser MapStutct (édition avancée)

Pour l'application de MapStruct, je recommande le Qiita suivant car il est très bien organisé.

Ici, écrivez le contenu qui ne figure pas dans la Qiita ci-dessus.

Où MapStruct a été introduit

Puisqu'il s'agit d'un outil avec une approche de génération automatique de code au moment de la compilation à l'aide du processeur d'annotation, il nécessite plus d'ingéniosité qu'une bibliothèque normale.

Configuration MapStruct ne fonctionne pas dans l'IDE, etc. simplement en l'ajoutant à la dépendance de pom.xml, et il est nécessaire de le définir en fonction de l'environnement. Ce qui suit est décrit en supposant un environnement Java8.

pom.xml Ajoutez la description suivante.

pom.xml



	<properties>
		<org.mapstruct.version>1.2.0.Final</org.mapstruct.version>
	</properties>

	<dependencies>
		<dependency>
			<groupId>org.mapstruct</groupId>
			<artifactId>mapstruct-processor</artifactId>
			<version>${org.mapstruct.version}</version>
		</dependency>
		<dependency>
			<groupId>org.mapstruct</groupId>
			<artifactId>mapstruct-jdk8</artifactId>
			<version>${org.mapstruct.version}</version>
			<scope>provided</scope>
		</dependency>
	</dependencies>

mapstruct-processor contient le traitement du processeur d'annotation. Les classes référencées lors de l'implémentation sont incluses dans mapstruct-jdk8.

Puisque mapstruct est une bibliothèque qui ne semble pas encore complètement morte, elle se comporte différemment d'une version à l'autre. Pour le moment (au 24 novembre 2017), assurez-vous de spécifier 1.2.0.Final.

Eclipse Plugin Les plugins suivants sont recommandés, alors mettons-les. https://marketplace.eclipse.org/content/mapstruct-eclipse-plugin

La description de l'annotation BeanMapper n'est pas reflétée immédiatement sur Eclipse

Je n'ai pas trouvé de solution fondamentale, mais je peux la traiter comme une solution de contournement avec les mesures suivantes. Notez qu'il n'y a aucun problème en utilisant la commande maven à partir de la ligne de commande.

Projet Eclipse Clean
[Project] - [Clean]

Package Maven ou test Maven sur Eclipse
[Run As] - [maven test]

Pour le moment, la FAQ sur le site officiel indique que si vous installez le plug-in, il sera automatiquement compilé sans aucun problème, donc en fonction de l'environnement, il peut fonctionner sans les mesures ci-dessus.

http://mapstruct.org/faq/#can-i-use-mapstruct-within-eclipse

Coexistence avec Lombok

Il a été dit qu'il n'est pas compatible avec Lombok (https://projectlombok.org/), une bibliothèque d'approche qui génère automatiquement du code basé sur des définitions d'annotations comme MapStruct.

Cependant, depuis la version 1.2.0.Final, MapStruct a été corrigé pour générer d'abord le code Lombok, donc si vous utilisez la dernière version, le problème ne se produira pas.

Pour plus d'informations, consultez la FAQ ci-dessous.

http://mapstruct.org/faq/#can-i-use-mapstruct-together-with-project-lombok

Project Lombok is an annotation processor that (amongst other things) adds getters and setters to the AST (abstract syntax tree) of compiled bean classes. AST modifications are not foreseen by Java annotation processing API, so quite some trickery was required within Lombok as well MapStruct to make both of them work together. Essentially, MapStruct will wait until Lombok has done all its amendments before generating mapper classes for Lombok-enhanced beans.

En outre, le numéro de github suivant décrit également des échanges détaillés concernant l'historique passé et le contenu de la correspondance. https://github.com/mapstruct/mapstruct/issues/510

Coexistence avec swagger-ui

Puisque swagger-ui utilise également MapStruct et que la version de MapStruct référencée est obsolète selon la version, il peut ne pas être possible de compiler correctement dans un environnement où swagger-ui est inclus dans la dépendance. (Au moins swagger-ui ne se compilera pas correctement sous la version 2.7.0)

Comme mentionné ci-dessus, si MapStruct est utilisé dans d'autres bibliothèques que vous utilisez et que la version est différente de celle que vous souhaitez utiliser, écrivez une définition d'exclusion dans chaque bibliothèque.

pom.xml


		<dependency>
			<groupId>io.springfox</groupId>
			<artifactId>springfox-swagger2</artifactId>
			<version>2.7.0</version>
			<exclusions>
				<exclusion>
					<groupId>org.mapstruct</groupId>
					<artifactId>mapstruct</artifactId>
				</exclusion>
			</exclusions>
		</dependency>
		<dependency>
			<groupId>io.springfox</groupId>
			<artifactId>springfox-swagger-ui</artifactId>
			<version>2.7.0</version>
			<exclusions>
				<exclusion>
					<groupId>org.mapstruct</groupId>
					<artifactId>mapstruct</artifactId>
				</exclusion>
			</exclusions>
		</dependency>

Recommended Posts

Effectuer une cartographie de bean à grande vitesse à l'aide de MapStruct
Copie de bean à l'aide de MapStruct
Cartographie de Bean avec MapStruct Partie 1
Cartographie Bean avec MapStruct Partie 3
Cartographie de Bean avec MapStruct Partie 2