[JAVA] Führen Sie das Bean-Mapping mit MapStruct mit hoher Geschwindigkeit durch

http://mapstruct.org/ MapStruct ist eine Bibliothek, die darauf abzielt, Bean Mapping einfach und mit hoher Geschwindigkeit durchzuführen, indem beim Kompilieren automatisch Code generiert wird, wobei die in der Klasse definierten Anmerkungsinformationen als Hinweis mithilfe eines Mechanismus namens Anmerkungsprozessor verwendet werden.

Diese Bibliothek wird auch in Awesome Java (https://github.com/akullpp/awesome-java/blob/master/README.md#bean-mapping) eingeführt, generiert jedoch beim Kompilieren statischen und soliden Code. Ich verwende dies auf der Entwicklungsseite, weil der Ansatz, dies zu tun, zu meinem persönlichen Anwendungsfall passt und in Tools wie Swagger verwendet wird.

Hallo Welt

Ich fühle mich wie ein Slapstick, aber lass uns gehen.

Durch das Schreiben des Folgenden kann die von Menschen geschriebene Codemenge so weit wie möglich reduziert werden, und Bean Mapping kann durch den automatisch generierten Code mit hoher Geschwindigkeit (schneller als Reflexion usw.) realisiert werden. Bitte machen Sie sich keine Sorgen um den Inhalt der Klasse, da diese keine besondere Bedeutung hat.

//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 generiert automatisch eine Implementierungsklasse, wenn Sie die Schnittstelle gemäß dem angegebenen Format beschreiben. Wenn Sie einen Blick auf den Entschlüsseler werfen, um zu sehen, welche Art von Quelle basierend auf dem obigen Code tatsächlich automatisch generiert wird, wird die folgende Quelle generiert.


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;
  }
}

Verwendung von MapStutct (Advanced Edition)

Für die Anwendung von MapStruct empfehle ich das folgende Qiita, da es sehr gut organisiert ist.

Schreiben Sie hier die Inhalte, die nicht in der obigen Qiita aufgeführt sind.

Wo MapStruct eingeführt wurde

Da es sich um ein Tool handelt, mit dem Code zur Kompilierungszeit mithilfe des Anmerkungsprozessors automatisch generiert werden kann, ist mehr Einfallsreichtum erforderlich als bei einer normalen Bibliothek.

Configuration MapStruct funktioniert nicht in IDE usw., indem es einfach zur Abhängigkeit von pom.xml hinzugefügt wird, und es ist erforderlich, es entsprechend der Umgebung festzulegen. Das Folgende wird unter der Annahme einer Java8-Umgebung beschrieben.

pom.xml Fügen Sie die folgende Beschreibung hinzu.

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>

Der Mapstruct-Prozessor enthält die Verarbeitung des Annotation Processor. Die Klassen, auf die während der Implementierung verwiesen wird, sind in mapstruct-jdk8 enthalten.

Da mapstruct eine Bibliothek ist, die noch nicht vollständig tot zu sein scheint, verhält sie sich von Version zu Version unterschiedlich. Geben Sie vorerst (Stand: 24. November 2017) unbedingt 1.2.0.Final an.

Eclipse Plugin Die folgenden Plugins werden empfohlen, also setzen wir sie ein. https://marketplace.eclipse.org/content/mapstruct-eclipse-plugin

Die Beschreibung der BeanMapper-Anmerkungen wird in Eclipse nicht sofort wiedergegeben

Ich habe keine grundlegende Lösung gefunden, kann sie jedoch mit den folgenden Maßnahmen umgehen. Beachten Sie, dass die Verwendung des Befehls maven über die Befehlszeile kein Problem darstellt.

Eclipse Project Clean
[Project] - [Clean]

Maven-Paket oder Maven-Test auf Eclipse
[Run As] - [maven test]

In den häufig gestellten Fragen auf der offiziellen Website heißt es vorerst, dass das Plug-In bei der Installation automatisch und problemlos kompiliert wird. Je nach Umgebung funktioniert es möglicherweise ohne die oben genannten Maßnahmen.

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

Koexistenz mit Lombok

Es wurde gesagt, dass es nicht mit Lombok (https://projectlombok.org/) kompatibel ist, einer Ansatzbibliothek, die automatisch Code basierend auf Annotationsdefinitionen wie MapStruct generiert.

Seit 1.2.0.Final wurde MapStruct jedoch so behoben, dass zuerst Lombok-Code generiert wird. Wenn Sie also die neueste Version verwenden, tritt das Problem nicht auf.

Weitere Informationen finden Sie in den FAQ unten.

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.

Darüber hinaus beschreibt die folgende Github-Ausgabe einen detaillierten Austausch über die Vergangenheit und den Inhalt der Korrespondenz. https://github.com/mapstruct/mapstruct/issues/510

Koexistenz mit Prahlerei-UI

Da swagger-ui auch MapStruct verwendet und die Version von MapStruct, auf die verwiesen wird, je nach Version veraltet ist, ist es möglicherweise nicht möglich, in einer Umgebung, in der swagger-ui in der Abhängigkeit enthalten ist, korrekt zu kompilieren. (Zumindest swagger-ui wird unter 2.7.0 nicht korrekt kompiliert)

Wie oben erwähnt, schreiben Sie in jede Bibliothek eine Ausschlussdefinition, wenn MapStruct in anderen Bibliotheken verwendet wird, die Sie verwenden, und die Version sich von der gewünschten unterscheidet.

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

Führen Sie das Bean-Mapping mit MapStruct mit hoher Geschwindigkeit durch
Bean-Kopie mit MapStruct
Bean-Mapping mit MapStruct Teil 1
Bean-Mapping mit MapStruct Teil 3
Bean-Mapping mit MapStruct Teil 2