- MapStruct 教程
- MapStruct - 首頁
- MapStruct - 概述
- MapStruct - 環境設定
- 對映
- MapStruct - 基本對映
- MapStruct - 自定義對映
- MapStruct - 多物件對映
- MapStruct - 巢狀 Bean 對映
- MapStruct - 直接欄位對映
- MapStruct - Builder
- 資料型別轉換
- MapStruct - 隱式型別轉換
- MapStruct - 使用 numberFormat
- MapStruct - 使用 dateFormat
- MapStruct - 使用表示式
- MapStruct - 使用常量
- MapStruct - 使用 defaultValue
- MapStruct - 使用 defaultExpression
- 集合對映
- MapStruct - 列表對映
- MapStruct - Map 對映
- 其他
- MapStruct - 流對映
- MapStruct - 列舉對映
- MapStruct - 丟擲異常
- MapStruct - 自定義 Mapper
- MapStruct 有用資源
- MapStruct 快速指南
- MapStruct - 有用資源
- MapStruct - 討論
MapStruct 快速指南
MapStruct - 概述
MapStruct 是一個註釋處理器,它被插入到 Java 編譯器中。插入後,它可以被 Maven、Gradle 等命令列工具用來處理對映註釋,在編譯時建立 Mapper 類。
何時需要對映?
在多層應用程式中,資料物件用於從資料庫中獲取資料,而 UI 與模型進行互動。現在,需要將獲取到資料模型中的資料對映到模型或 Java Bean,然後傳遞給 UI。請考慮以下情況。
與資料庫連線的實體類。
StudentEntity.java
@Entity
class StudentEntity {
String id;
String name;
}
與 UI 連線的模型類。
Student.java
class Student {
String id;
String name;
}
MapStruct 如何工作?
MapStruct 使用註解自動化建立 Mapper 的過程,以將資料物件與模型物件對映。它在編譯時建立 Mapper 實現,這有助於開發人員在開發過程中發現錯誤,並使其易於理解。例如 -
StudentMapper.java
@Mapper
class StudentMapper {
StudentMapper INSTANCE = Mappers.getMapper( StudentMapper.class );
StudentEntity modelToEntity(Student student);
}
現在可以使用 StudentMapper.INSTANCE 輕鬆獲取對映後的物件。
StudentEntity studentEntity = StudentMapper.INSTANCE.modelToEntity(student);
MapStruct - 環境設定
MapStruct 是一個基於 Java 的庫,因此第一個要求是在您的機器上安裝 JDK。
步驟 1 - 設定 Java 開發工具包 (JDK)
您可以從 Oracle 的 Java 網站下載最新版本的 SDK - Java SE 下載。 您將在下載的檔案中找到安裝 JDK 的說明,請按照給定的說明進行安裝和配置設定。最後設定 PATH 和 JAVA_HOME 環境變數以引用包含 java 和 javac 的目錄,通常分別為 java_install_dir/bin 和 java_install_dir。
如果您正在執行 Windows 並已將 JDK 安裝在 C:\jdk-9.0.1 中,則必須將以下行放入 C:\autoexec.bat 檔案中。
set PATH=C:\jdk-11.0.11\bin;%PATH% set JAVA_HOME=C:\jdk-11.0.11
或者,在 Windows NT/2000/XP 上,您需要右鍵單擊“我的電腦”,選擇“屬性”→“高階”→“環境變數”。然後,您需要更新 PATH 值並單擊“確定”按鈕。
在 Unix(Solaris、Linux 等)上,如果 SDK 安裝在 /usr/local/jdk-9.0.1 中並且您使用的是 C shell,則需要將以下內容放入 .cshrc 檔案中。
setenv PATH /usr/local/jdk-11.0.11/bin:$PATH setenv JAVA_HOME /usr/local/jdk-11.0.11
或者,如果您使用的是整合開發環境 (IDE),例如 Borland JBuilder、Eclipse、IntelliJ IDEA 或 Sun ONE Studio,則需要編譯並執行一個簡單的程式以確認 IDE 知道您已將 Java 安裝在何處。否則,您需要按照 IDE 文件中給出的說明進行正確的設定。
步驟 2 - 安裝 mapstruct 庫以及依賴項
從 MVNRepository 下載以下 jar 並將其用於您的類路徑。
mapstruct-1.5.0.Beta1.jar
mapstruct-processor-1.5.0.Beta1.jar
確保您已正確設定此目錄上的 CLASSPATH 變數,否則在執行應用程式時會遇到問題。
步驟 3 - 設定 Eclipse IDE
本教程中的所有示例均使用 Eclipse IDE 編寫。因此,我們建議您應該在您的機器上安裝最新版本的 Eclipse。
要安裝 Eclipse IDE,請從 www.eclipse.org/downloads 下載最新的 Eclipse 二進位制檔案。下載安裝後,將二進位制分發版解壓縮到方便的位置。例如,在 Windows 上的 C:\eclipse 中,或在 Linux/Unix 上的 /usr/local/eclipse 中,最後正確設定 PATH 變數。
可以透過在 Windows 機器上執行以下命令來啟動 Eclipse,或者您可以簡單地雙擊 eclipse.exe
%C:\eclipse\eclipse.exe
可以透過在 Unix(Solaris、Linux 等)機器上執行以下命令來啟動 Eclipse -
$/usr/local/eclipse/eclipse
成功啟動後,如果一切正常,則應顯示以下結果 -
步驟 4 - 建立 Maven 專案
C:\MVN>mvn archetype:generate -DgroupId = com.tutorialspoint.mapping -DartifactId = mapping -DarchetypeArtifactId = maven-archetype-quickstart -DinteractiveMode = false
它將建立一個 Maven 專案。現在更新 pom.xml 檔案,如下所示 -
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.tutorialspoint.mapping</groupId>
<artifactId>mapping</artifactId>
<packaging>jar</packaging>
<version>1.0-SNAPSHOT</version>
<name>mapping</name>
<url>http://maven.apache.org</url>
<dependencies>
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-engine</artifactId>
<version>5.0.0</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.mapstruct</groupId>
<artifactId>mapstruct</artifactId>
<version>1.5.0.Beta1</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.1</version>
<configuration>
<source>11</source>
<target>11</target>
<annotationProcessorPaths>
<path>
<groupId>org.mapstruct</groupId>
<artifactId>mapstruct-processor</artifactId>
<version>1.5.0.Beta1</version>
</path>
</annotationProcessorPaths>
</configuration>
</plugin>
</plugins>
</build>
</project>
執行以下命令以更新 Maven 依賴項並構建專案。
mvn package
命令成功後。將基於 Maven 的專案作為 Maven 專案匯入 Eclipse。其餘的 Eclipse 將處理。
MapStruct - 基本對映
使用 Mapstruct 非常簡單。要建立 Mapper,請在介面上使用 **org.mapstruct.Mapper** 註解。
@Mapper
public interface StudentMapper {...}
現在在介面中建立一個轉換方法。
@Mapper
public interface StudentMapper {
Student getModelFromEntity(StudentEntity student);
}
如果源物件和目標物件的屬性名稱相同,則這些屬性將自動對映。如果屬性名稱不同,請使用 @Mapping 註解,如下所示 -
@Mapper
public interface StudentMapper {
@Mapping(target="className", source="classVal")
Student getModelFromEntity(StudentEntity student);
}
此處 className 是 Student 中的屬性名稱,一個目標物件,classVal 是 StudentEntity 中的屬性名稱,一個源物件。
示例
在 Eclipse 中開啟在 環境設定 章節中建立的專案對映。
使用以下程式碼建立 Student.java -
Student.java
package com.tutorialspoint.model;
public class Student {
private int id;
private String name;
private String className;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getClassName() {
return className;
}
public void setClassName(String className) {
this.className = className;
}
}
使用以下程式碼建立 Student.java -
StudentEntity.java
package com.tutorialspoint.entity;
public class StudentEntity {
private int id;
private String name;
private String classVal;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getClassVal() {
return classVal;
}
public void setClassVal(String classVal) {
this.classVal = classVal;
}
}
使用以下程式碼建立 StudentMapper.java -
StudentMapper.java
package com.tutorialspoint.mapper;
import org.mapstruct.Mapper;
import org.mapstruct.Mapping;
import com.tutorialspoint.entity.StudentEntity;
import com.tutorialspoint.model.Student;
@Mapper
public interface StudentMapper {
@Mapping(target="className", source="classVal")
Student getModelFromEntity(StudentEntity student);
@Mapping(target="classVal", source="className")
StudentEntity getEntityFromModel(Student student);
}
使用以下程式碼建立 StudentMapperTest.java -
StudentMapperTest.java
package com.tutorialspoint.mapping;
import static org.junit.jupiter.api.Assertions.assertEquals;
import org.junit.jupiter.api.Test;
import org.mapstruct.factory.Mappers;
import com.tutorialspoint.entity.StudentEntity;
import com.tutorialspoint.mapper.StudentMapper;
import com.tutorialspoint.model.Student;
public class StudentMapperTest {
private StudentMapper studentMapper
= Mappers.getMapper(StudentMapper.class);
@Test
public void testEntityToModel() {
StudentEntity entity = new StudentEntity();
entity.setClassVal("X");
entity.setName("John");
entity.setId(1);
Student model = studentMapper.getModelFromEntity(entity);
assertEquals(entity.getClassVal(), model.getClassName());
assertEquals(entity.getName(), model.getName());
assertEquals(entity.getId(), model.getId());
}
@Test
public void testModelToEntity() {
Student model = new Student();
model.setId(1);
model.setName("John");
model.setClassName("X");
StudentEntity entity = studentMapper.getEntityFromModel(model);
assertEquals(entity.getClassVal(), model.getClassName());
assertEquals(entity.getName(), model.getName());
assertEquals(entity.getId(), model.getId());
}
}
執行以下命令測試對映。
mvn clean test
命令成功後。驗證輸出。
mvn clean test [INFO] Scanning for projects... ... [INFO] --- maven-surefire-plugin:2.12.4:test (default-test) @ mapping --- [INFO] Surefire report directory: \mvn\mapping\target\surefire-reports ------------------------------------------------------- T E S T S ------------------------------------------------------- Running com.tutorialspoint.mapping.StudentMapperTest Tests run: 2, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.004 sec ...
MapStruct - 自定義對映
我們還可以將自定義方法新增到使用 **org.mapstruct.Mapper** 註解建立的 Mapper 中。我們也可以建立抽象類而不是介面。Mapstruct 自動建立相應的 Mapper 類。
現在在介面中建立一個預設轉換方法。
@Mapper
public interface StudentMapper {
default Student getModelFromEntity(StudentEntity studentEntity){
Student student = new Student();
student.setId(studentEntity.getId());
student.setName(studentEntity.getName());
student.setClassName(studentEntity.getClassVal());
return student;
}
}
以類似的方式,我們也可以建立抽象類以及 Mapper。
@Mapper
public absgract class StudentMapper {
Student getModelFromEntity(StudentEntity studentEntity){
Student student = new Student();
student.setId(studentEntity.getId());
student.setName(studentEntity.getName());
student.setClassName(studentEntity.getClassVal());
return student;
}
}
示例
在 Eclipse 中開啟在 環境設定 章節中建立的專案 mediaPlayer。
使用以下程式碼建立 Student.java -
Student.java
package com.tutorialspoint.model;
public class Student {
private int id;
private String name;
private String className;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getClassName() {
return className;
}
public void setClassName(String className) {
this.className = className;
}
}
使用以下程式碼建立 Student.java -
StudentEntity.java
package com.tutorialspoint.entity;
public class StudentEntity {
private int id;
private String name;
private String classVal;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getClassVal() {
return classVal;
}
public void setClassVal(String classVal) {
this.classVal = classVal;
}
}
使用以下程式碼建立 StudentMapper.java -
StudentMapper.java
package com.tutorialspoint.mapper;
import org.mapstruct.Mapper;
import org.mapstruct.Mapping;
import com.tutorialspoint.entity.StudentEntity;
import com.tutorialspoint.model.Student;
@Mapper
public interface StudentMapper {
default Student getModelFromEntity(StudentEntity studentEntity){
Student student = new Student();
student.setId(studentEntity.getId());
student.setName(studentEntity.getName());
student.setClassName(studentEntity.getClassVal());
return student;
}
@Mapping(target="classVal", source="className")
StudentEntity getEntityFromModel(Student student);
}
使用以下程式碼建立 StudentMapperTest.java -
StudentMapperTest.java
package com.tutorialspoint.mapping;
import static org.junit.jupiter.api.Assertions.assertEquals;
import org.junit.jupiter.api.Test;
import org.mapstruct.factory.Mappers;
import com.tutorialspoint.entity.StudentEntity;
import com.tutorialspoint.mapper.StudentMapper;
import com.tutorialspoint.model.Student;
public class StudentMapperTest {
private StudentMapper studentMapper
= Mappers.getMapper(StudentMapper.class);
@Test
public void testEntityToModel() {
StudentEntity entity = new StudentEntity();
entity.setClassVal("X");
entity.setName("John");
entity.setId(1);
Student model = studentMapper.getModelFromEntity(entity);
assertEquals(entity.getClassVal(), model.getClassName());
assertEquals(entity.getName(), model.getName());
assertEquals(entity.getId(), model.getId());
}
@Test
public void testModelToEntity() {
Student model = new Student();
model.setId(1);
model.setName("John");
model.setClassName("X");
StudentEntity entity = studentMapper.getEntityFromModel(model);
assertEquals(entity.getClassVal(), model.getClassName());
assertEquals(entity.getName(), model.getName());
assertEquals(entity.getId(), model.getId());
}
}
執行以下命令測試對映。
mvn clean test
命令成功後。驗證輸出。
mvn clean test [INFO] Scanning for projects... ... [INFO] --- maven-surefire-plugin:2.12.4:test (default-test) @ mapping --- [INFO] Surefire report directory: \mvn\mapping\target\surefire-reports ------------------------------------------------------- T E S T S ------------------------------------------------------- Running com.tutorialspoint.mapping.StudentMapperTest Tests run: 2, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.004 sec ...
MapStruct - 多物件對映
我們還可以新增對映多個物件的功能。例如,我們想使用 Student 和 Address 物件獲取 DeliveryAddress 物件。
現在建立一個 Mapper 介面,它可以將兩個物件對映到一個物件。
@Mapper
public interface DeliveryAddressMapper {
@Mapping(source = "student.name", target = "name")
@Mapping(source = "address.houseNo", target = "houseNumber")
DeliveryAddress getDeliveryAddress(StudentEntity student, AddressEntity address);
}
示例
在 Eclipse 中開啟在 自定義對映 章節中更新的專案對映。
使用以下程式碼建立 DeliveryAddress.java -
DeliveryAddress.java
package com.tutorialspoint.model;
public class DeliveryAddress {
private String name;
private int houseNumber;
private String city;
private String state;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getHouseNumber() {
return houseNumber;
}
public void setHouseNumber(int houseNumber) {
this.houseNumber = houseNumber;
}
public String getCity() {
return city;
}
public void setCity(String city) {
this.city = city;
}
public String getState() {
return state;
}
public void setState(String state) {
this.state = state;
}
}
使用以下程式碼建立 AddressEntity.java -
AddressEntity.java
package com.tutorialspoint.entity;
public class AddressEntity {
private int houseNo;
private String city;
private String state;
public int getHouseNo() {
return houseNo;
}
public void setHouseNo(int houseNo) {
this.houseNo = houseNo;
}
public String getCity() {
return city;
}
public void setCity(String city) {
this.city = city;
}
public String getState() {
return state;
}
public void setState(String state) {
this.state = state;
}
}
使用以下程式碼建立 DeliveryAddressMapper.java -
DeliveryAddressMapper.java
package com.tutorialspoint.mapper;
import org.mapstruct.Mapper;
import org.mapstruct.Mapping;
import com.tutorialspoint.entity.AddressEntity;
import com.tutorialspoint.entity.StudentEntity;
import com.tutorialspoint.model.DeliveryAddress;
@Mapper
public interface DeliveryAddressMapper {
@Mapping(source = "student.name", target = "name")
@Mapping(source = "address.houseNo", target = "houseNumber")
DeliveryAddress getDeliveryAddress(StudentEntity student, AddressEntity address);
}
使用以下程式碼建立 DeliveryAddressMapperTest.java -
DeliveryAddressMapperTest.java
package com.tutorialspoint.mapping;
import static org.junit.jupiter.api.Assertions.assertEquals;
import org.junit.jupiter.api.Test;
import org.mapstruct.factory.Mappers;
import com.tutorialspoint.entity.AddressEntity;
import com.tutorialspoint.entity.StudentEntity;
import com.tutorialspoint.mapper.DeliveryAddressMapper;
import com.tutorialspoint.model.DeliveryAddress;
public class DeliveryAddressMapperTest {
private DeliveryAddressMapper deliveryAddressMapper
= Mappers.getMapper(DeliveryAddressMapper.class);
@Test
public void testEntityToModel() {
StudentEntity student = new StudentEntity();
student.setClassVal("X");
student.setName("John");
student.setId(1);
AddressEntity address = new AddressEntity();
address.setCity("Y");
address.setState("Z");
address.setHouseNo(1);
DeliveryAddress deliveryAddress = deliveryAddressMapper.getDeliveryAddress(student, address);
assertEquals(deliveryAddress.getName(), student.getName());
assertEquals(deliveryAddress.getCity(), address.getCity());
assertEquals(deliveryAddress.getState(), address.getState());
assertEquals(deliveryAddress.getHouseNumber(), address.getHouseNo());
}
}
執行以下命令測試對映。
mvn clean test
命令成功後。驗證輸出。
mvn clean test [INFO] Scanning for projects... ... [INFO] --- maven-surefire-plugin:2.12.4:test (default-test) @ mapping --- [INFO] Surefire report directory: \mvn\mapping\target\surefire-reports ------------------------------------------------------- T E S T S ------------------------------------------------------- Running com.tutorialspoint.mapping.DeliveryAddressMapperTest Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.011 sec Running com.tutorialspoint.mapping.StudentMapperTest Tests run: 2, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.001 sec Results : Tests run: 3, Failures: 0, Errors: 0, Skipped: 0 ...
MapStruct - 巢狀 Bean 對映
MapStruct 無縫處理巢狀對映。例如,具有 Subject 作為巢狀 Bean 的 Student。
現在建立一個 Mapper 介面,它可以對映巢狀物件。
@Mapper
public interface StudentMapper {
@Mapping(target="className", source="classVal")
@Mapping(target="subject", source="subject.name")
Student getModelFromEntity(StudentEntity studentEntity);
@Mapping(target="classVal", source="className")
@Mapping(target="subject.name", source="subject")
StudentEntity getEntityFromModel(Student student);
}
示例
在 Eclipse 中開啟在 多物件對映 章節中更新的專案對映。
使用以下程式碼建立 SubjectEntity.java -
SubjectEntity.java
package com.tutorialspoint.entity;
public class SubjectEntity {
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
使用以下程式碼更新 StudentEntity.java -
StudentEntity.java
package com.tutorialspoint.entity;
public class StudentEntity {
private int id;
private String name;
private String classVal;
private SubjectEntity subject;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getClassVal() {
return classVal;
}
public void setClassVal(String classVal) {
this.classVal = classVal;
}
public SubjectEntity getSubject() {
return subject;
}
public void setSubject(SubjectEntity subject) {
this.subject = subject;
}
}
使用以下程式碼更新 Student.java -
Student.java
package com.tutorialspoint.model;
public class Student {
private int id;
private String name;
private String className;
private String subject;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getClassName() {
return className;
}
public void setClassName(String className) {
this.className = className;
}
public String getSubject() {
return subject;
}
public void setSubject(String subject) {
this.subject = subject;
}
}
使用以下程式碼更新 StudentMapper.java -
StudentMapper.java
package com.tutorialspoint.mapper;
import org.mapstruct.Mapper;
import org.mapstruct.Mapping;
import com.tutorialspoint.entity.StudentEntity;
import com.tutorialspoint.model.Student;
@Mapper
public interface StudentMapper {
@Mapping(target="className", source="classVal")
@Mapping(target="subject", source="subject.name")
Student getModelFromEntity(StudentEntity studentEntity);
@Mapping(target="classVal", source="className")
@Mapping(target="subject.name", source="subject")
StudentEntity getEntityFromModel(Student student);
}
使用以下程式碼更新 StudentMapperTest.java -
StudentMapperTest.java
package com.tutorialspoint.mapping;
import static org.junit.jupiter.api.Assertions.assertEquals;
import org.junit.jupiter.api.Test;
import org.mapstruct.factory.Mappers;
import com.tutorialspoint.entity.StudentEntity;
import com.tutorialspoint.entity.SubjectEntity;
import com.tutorialspoint.mapper.StudentMapper;
import com.tutorialspoint.model.Student;
public class StudentMapperTest {
private StudentMapper studentMapper
= Mappers.getMapper(StudentMapper.class);
@Test
public void testEntityToModel() {
StudentEntity entity = new StudentEntity();
entity.setClassVal("X");
entity.setName("John");
entity.setId(1);
SubjectEntity subject = new SubjectEntity();
subject.setName("Computer");
entity.setSubject(subject);
Student model = studentMapper.getModelFromEntity(entity);
assertEquals(entity.getClassVal(), model.getClassName());
assertEquals(entity.getName(), model.getName());
assertEquals(entity.getId(), model.getId());
assertEquals(entity.getSubject().getName(), model.getSubject());
}
@Test
public void testModelToEntity() {
Student model = new Student();
model.setId(1);
model.setName("John");
model.setClassName("X");
model.setSubject("Science");
StudentEntity entity = studentMapper.getEntityFromModel(model);
assertEquals(entity.getClassVal(), model.getClassName());
assertEquals(entity.getName(), model.getName());
assertEquals(entity.getId(), model.getId());
assertEquals(entity.getSubject().getName(), model.getSubject());
}
}
執行以下命令測試對映。
mvn clean test
命令成功後。驗證輸出。
mvn clean test [INFO] Scanning for projects... ... [INFO] --- maven-surefire-plugin:2.12.4:test (default-test) @ mapping --- [INFO] Surefire report directory: \mvn\mapping\target\surefire-reports ------------------------------------------------------- T E S T S ------------------------------------------------------- Running com.tutorialspoint.mapping.DeliveryAddressMapperTest Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.005 sec Running com.tutorialspoint.mapping.StudentMapperTest Tests run: 2, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.002 sec Results : Tests run: 3, Failures: 0, Errors: 0, Skipped: 0 ...
MapStruct - 直接欄位對映
MapStruct 輕鬆處理直接欄位對映。例如,Student 具有 section 作為私有屬性,而 StudentEntity 具有 section 作為公共屬性。要進行 getter/setter 對映,屬性必須是公共的。如果是 public final,則只有 getter 方法可用於對映。
現在建立一個 Mapper 介面。我們將使用 @InheritInverseConfiguration 註解來複制反向配置。
@Mapper
public interface StudentMapper {
@Mapping(target="className", source="classVal")
@Mapping(target="subject", source="subject.name")
Student getModelFromEntity(StudentEntity studentEntity);
@InheritInverseConfiguration
StudentEntity getEntityFromModel(Student student);
}
示例
在 Eclipse 中開啟在 巢狀物件對映 章節中更新的專案對映。
使用以下程式碼更新 StudentEntity.java -
StudentEntity.java
package com.tutorialspoint.entity;
public class StudentEntity {
private int id;
private String name;
private String classVal;
private SubjectEntity subject;
public String section;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getClassVal() {
return classVal;
}
public void setClassVal(String classVal) {
this.classVal = classVal;
}
public SubjectEntity getSubject() {
return subject;
}
public void setSubject(SubjectEntity subject) {
this.subject = subject;
}
}
使用以下程式碼更新 Student.java -
Student.java
package com.tutorialspoint.model;
public class Student {
private int id;
private String name;
private String className;
private String subject;
private String section;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getClassName() {
return className;
}
public void setClassName(String className) {
this.className = className;
}
public String getSubject() {
return subject;
}
public void setSubject(String subject) {
this.subject = subject;
}
public String getSection() {
return section;
}
public void setSection(String section) {
this.section = section;
}
}
使用以下程式碼更新 StudentMapper.java -
StudentMapper.java
package com.tutorialspoint.mapper;
import org.mapstruct.InheritInverseConfiguration;
import org.mapstruct.Mapper;
import org.mapstruct.Mapping;
import com.tutorialspoint.entity.StudentEntity;
import com.tutorialspoint.model.Student;
@Mapper
public interface StudentMapper {
@Mapping(target="className", source="classVal")
@Mapping(target="subject", source="subject.name")
Student getModelFromEntity(StudentEntity studentEntity);
@InheritInverseConfiguration
StudentEntity getEntityFromModel(Student student);
}
使用以下程式碼更新 StudentMapperTest.java -
StudentMapperTest.java
package com.tutorialspoint.mapping;
import static org.junit.jupiter.api.Assertions.assertEquals;
import org.junit.jupiter.api.Test;
import org.mapstruct.factory.Mappers;
import com.tutorialspoint.entity.StudentEntity;
import com.tutorialspoint.entity.SubjectEntity;
import com.tutorialspoint.mapper.StudentMapper;
import com.tutorialspoint.model.Student;
public class StudentMapperTest {
private StudentMapper studentMapper
= Mappers.getMapper(StudentMapper.class);
@Test
public void testEntityToModel() {
StudentEntity entity = new StudentEntity();
entity.setClassVal("X");
entity.setName("John");
entity.setId(1);
entity.section = "A";
SubjectEntity subject = new SubjectEntity();
subject.setName("Computer");
entity.setSubject(subject);
Student model = studentMapper.getModelFromEntity(entity);
assertEquals(entity.getClassVal(), model.getClassName());
assertEquals(entity.getName(), model.getName());
assertEquals(entity.getId(), model.getId());
assertEquals(entity.getSubject().getName(), model.getSubject());
assertEquals(entity.section, model.getSection());
}
@Test
public void testModelToEntity() {
Student model = new Student();
model.setId(1);
model.setName("John");
model.setClassName("X");
model.setSubject("Science");
model.setSection("A");
StudentEntity entity = studentMapper.getEntityFromModel(model);
assertEquals(entity.getClassVal(), model.getClassName());
assertEquals(entity.getName(), model.getName());
assertEquals(entity.getId(), model.getId());
assertEquals(entity.getSubject().getName(), model.getSubject());
assertEquals(entity.section, model.getSection());
}
}
執行以下命令測試對映。
mvn clean test
命令成功後。驗證輸出。
mvn clean test [INFO] Scanning for projects... ... [INFO] --- maven-surefire-plugin:2.12.4:test (default-test) @ mapping --- [INFO] Surefire report directory: \mvn\mapping\target\surefire-reports ------------------------------------------------------- T E S T S ------------------------------------------------------- Running com.tutorialspoint.mapping.DeliveryAddressMapperTest Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.005 sec Running com.tutorialspoint.mapping.StudentMapperTest Tests run: 2, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.002 sec Results : Tests run: 3, Failures: 0, Errors: 0, Skipped: 0 ...
MapStruct - 使用 Builder
MapStruct 允許使用 Builder。我們可以使用 Builder 框架或使用我們自定義的 Builder。在下面的示例中,我們使用自定義 Builder。
示例
在 Eclipse 中開啟在 直接欄位對映 章節中更新的專案對映。
使用以下程式碼更新 Student.java -
Student.java
package com.tutorialspoint.model;
public class Student {
private final String name;
private final int id;
protected Student(Student.Builder builder) {
this.name = builder.name;
this.id = builder.id;
}
public static Student.Builder builder() {
return new Student.Builder();
}
public static class Builder {
private String name;
private int id;
public Builder name(String name) {
this.name = name;
return this;
}
public Builder id(int id) {
this.id = id;
return this;
}
public Student create() {
return new Student( this );
}
}
public String getName() {
return name;
}
public int getId() {
return id;
}
}
使用以下程式碼更新 StudentMapper.java -
StudentMapper.java
package com.tutorialspoint.mapper;
import org.mapstruct.Mapper;
import org.mapstruct.Mapping;
import com.tutorialspoint.entity.StudentEntity;
import com.tutorialspoint.model.Student;
@Mapper
public interface StudentMapper {
Student getModelFromEntity(StudentEntity studentEntity);
@Mapping(target="id", source="id")
@Mapping(target="name", source="name")
StudentEntity getEntityFromModel(Student student);
}
使用以下程式碼更新 StudentMapperTest.java -
StudentMapperTest.java
package com.tutorialspoint.mapping;
import static org.junit.jupiter.api.Assertions.assertEquals;
import org.junit.jupiter.api.Test;
import org.mapstruct.factory.Mappers;
import com.tutorialspoint.entity.StudentEntity;
import com.tutorialspoint.entity.SubjectEntity;
import com.tutorialspoint.mapper.StudentMapper;
import com.tutorialspoint.model.Student;
public class StudentMapperTest {
private StudentMapper studentMapper = Mappers.getMapper(StudentMapper.class);
@Test
public void testEntityToModel() {
StudentEntity entity = new StudentEntity();
entity.setName("John");
entity.setId(1);
Student model = studentMapper.getModelFromEntity(entity);
assertEquals(entity.getName(), model.getName());
assertEquals(entity.getId(), model.getId());
}
@Test
public void testModelToEntity() {
Student.Builder builder = Student.builder().id(1).name("John");
Student model = builder.create();
StudentEntity entity = studentMapper.getEntityFromModel(model);
assertEquals(entity.getName(), model.getName());
assertEquals(entity.getId(), model.getId());
}
}
執行以下命令測試對映。
mvn clean test
輸出
命令成功後。驗證輸出。
mvn clean test [INFO] Scanning for projects... ... [INFO] --- maven-surefire-plugin:2.12.4:test (default-test) @ mapping --- [INFO] Surefire report directory: \mvn\mapping\target\surefire-reports ------------------------------------------------------- T E S T S ------------------------------------------------------- Running com.tutorialspoint.mapping.DeliveryAddressMapperTest Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.005 sec Running com.tutorialspoint.mapping.StudentMapperTest Tests run: 2, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.002 sec Results : Tests run: 3, Failures: 0, Errors: 0, Skipped: 0 ...
MapStruct - 隱式型別轉換
MapStruct 在大多數情況下自動處理型別轉換。例如,int 到 Long 或 String 的轉換。轉換也處理空值。以下是一些重要的自動轉換。
在基本型別和對應的包裝類之間。
在基本型別和 String 之間。
在列舉型別和 String 之間。
在 BigInt、BigDecimal 和 String 之間。
在 Calendar/Date 和 XMLGregorianCalendar 之間。
在 XMLGregorianCalendar 和 String 之間。
在 Jodas 日期型別和 String 之間。
示例
在 Eclipse 中開啟在 使用 Builder 對映 章節中更新的專案對映。
使用以下程式碼更新 StudentEntity.java -
StudentEntity.java
package com.tutorialspoint.entity;
public class StudentEntity {
private String id;
private String name;
private String classVal;
private SubjectEntity subject;
public String section;
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getClassVal() {
return classVal;
}
public void setClassVal(String classVal) {
this.classVal = classVal;
}
public SubjectEntity getSubject() {
return subject;
}
public void setSubject(SubjectEntity subject) {
this.subject = subject;
}
}
Student.java 保持不變,程式碼如下 -
Student.java
package com.tutorialspoint.model;
public class Student {
private final String name;
private final int id;
protected Student(Student.Builder builder) {
this.name = builder.name;
this.id = builder.id;
}
public static Student.Builder builder() {
return new Student.Builder();
}
public static class Builder {
private String name;
private int id;
public Builder name(String name) {
this.name = name;
return this;
}
public Builder id(int id) {
this.id = id;
return this;
}
public Student create() {
return new Student( this );
}
}
public String getName() {
return name;
}
public int getId() {
ret+urn id;
}
}
使用以下程式碼更新 DeliveryAddressMapperTest.java -
DeliveryAddressMapperTest.java
package com.tutorialspoint.mapping;
import static org.junit.jupiter.api.Assertions.assertEquals;
import org.junit.jupiter.api.Test;
import org.mapstruct.factory.Mappers;
import com.tutorialspoint.entity.AddressEntity;
import com.tutorialspoint.entity.StudentEntity;
import com.tutorialspoint.mapper.DeliveryAddressMapper;
import com.tutorialspoint.model.DeliveryAddress;
public class DeliveryAddressMapperTest {
private DeliveryAddressMapper deliveryAddressMapper
= Mappers.getMapper(DeliveryAddressMapper.class);
@Test
public void testEntityToModel() {
StudentEntity student = new StudentEntity();
student.setClassVal("X");
student.setName("John");
student.setId("1");
AddressEntity address = new AddressEntity();
address.setCity("Y");
address.setState("Z");
address.setHouseNo(1);
DeliveryAddress deliveryAddress = deliveryAddressMapper.getDeliveryAddress(student, address);
assertEquals(deliveryAddress.getName(), student.getName());
assertEquals(deliveryAddress.getCity(), address.getCity());
assertEquals(deliveryAddress.getState(), address.getState());
assertEquals(deliveryAddress.getHouseNumber(), address.getHouseNo());
}
}
使用以下程式碼更新 StudentMapperTest.java -
StudentMapperTest.java
package com.tutorialspoint.mapping;
import static org.junit.jupiter.api.Assertions.assertEquals;
import org.junit.jupiter.api.Test;
import org.mapstruct.factory.Mappers;
import com.tutorialspoint.entity.StudentEntity;
import com.tutorialspoint.entity.SubjectEntity;
import com.tutorialspoint.mapper.StudentMapper;
import com.tutorialspoint.model.Student;
public class StudentMapperTest {
private StudentMapper studentMapper
= Mappers.getMapper(StudentMapper.class);
@Test
public void testEntityToModel() {
StudentEntity entity = new StudentEntity();
entity.setName("John");
entity.setId("1");
Student model = studentMapper.getModelFromEntity(entity);
assertEquals(entity.getName(), model.getName());
assertEquals(Integer.parseInt(entity.getId()), model.getId());
}
@Test
public void testModelToEntity() {
Student.Builder builder = Student.builder().id(1).name("John");
Student model = builder.create();
StudentEntity entity = studentMapper.getEntityFromModel(model);
assertEquals(entity.getName(), model.getName());
assertEquals(Integer.parseInt(entity.getId()), model.getId());
}
}
執行以下命令測試對映。
mvn clean test
命令成功後。驗證輸出。
mvn clean test [INFO] Scanning for projects... ... [INFO] --- maven-surefire-plugin:2.12.4:test (default-test) @ mapping --- [INFO] Surefire report directory: \mvn\mapping\target\surefire-reports ------------------------------------------------------- T E S T S ------------------------------------------------------- Running com.tutorialspoint.mapping.DeliveryAddressMapperTest Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.005 sec Running com.tutorialspoint.mapping.StudentMapperTest Tests run: 2, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.002 sec Results : Tests run: 3, Failures: 0, Errors: 0, Skipped: 0 ...
MapStruct - 使用 numberFormat
MapStruct 無縫處理將數字轉換為所需格式的 String。我們可以在 @Mapping 註解期間將所需的格式作為 numberFormat 傳遞。例如,考慮一種情況,其中以數字儲存的金額需要以貨幣格式顯示。
**源** - 實體的價格為 350。
**目標** - 模型顯示價格為 $350.00。
**numberFormat** - 使用格式 $#.00
示例
在 Eclipse 中開啟在 對映隱式型別轉換 章節中更新的專案對映。
使用以下程式碼建立 CarEntity.java -
CarEntity.java
package com.tutorialspoint.entity;
public class CarEntity {
private int id;
private double price;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public double getPrice() {
return price;
}
public void setPrice(double price) {
this.price = price;
}
}
使用以下程式碼建立 Car.java -
Car.java
package com.tutorialspoint.model;
public class Car {
private int id;
private String price;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getPrice() {
return price;
}
public void setPrice(String price) {
this.price = price;
}
}
使用以下程式碼建立 CarMapper.java -
CarMapper.java
package com.tutorialspoint.mapper;
import org.mapstruct.Mapper;
import org.mapstruct.Mapping;
import com.tutorialspoint.entity.CarEntity;
import com.tutorialspoint.model.Car;
@Mapper
public interface CarMapper {
@Mapping(source = "price", target = "price", numberFormat = "$#.00")
Car getModelFromEntity(CarEntity carEntity);
}
使用以下程式碼建立 CarMapperTest.java -
CarMapperTest.java
package com.tutorialspoint.mapping;
import static org.junit.jupiter.api.Assertions.assertEquals;
import org.junit.jupiter.api.Test;
import org.mapstruct.factory.Mappers;
import com.tutorialspoint.entity.CarEntity;
import com.tutorialspoint.mapper.CarMapper;
import com.tutorialspoint.model.Car;
public class CarMapperTest {
private CarMapper carMapper
= Mappers.getMapper(CarMapper.class);
@Test
public void testEntityToModel() {
CarEntity entity = new CarEntity();
entity.setPrice(345000);
entity.setId(1);
Car model = carMapper.getModelFromEntity(entity);
assertEquals(model.getPrice(), "$345000.00");
assertEquals(entity.getId(), model.getId());
}
}
執行以下命令測試對映。
mvn clean test
命令成功後。驗證輸出。
mvn clean test [INFO] Scanning for projects... ... [INFO] --- maven-surefire-plugin:2.12.4:test (default-test) @ mapping --- [INFO] Surefire report directory: \mvn\mapping\target\surefire-reports ------------------------------------------------------- T E S T S ------------------------------------------------------- Running com.tutorialspoint.mapping.CarMapperTest Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.035 sec Running com.tutorialspoint.mapping.DeliveryAddressMapperTest Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0 sec Running com.tutorialspoint.mapping.StudentMapperTest Tests run: 2, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.001 sec Results : Tests run: 4, Failures: 0, Errors: 0, Skipped: 0 ...
MapStruct - 使用 dateFormat
MapStruct 無縫處理將日期轉換為所需格式的 String。我們可以在 @Mapping 註解期間將所需的格式作為 dateFormat 傳遞。例如,考慮一種情況,其中以數字儲存的日期需要以特定格式顯示。
**源** - 實體的日期為 GregorianCalendar(2015, 3, 5)。
**目標** - 模型顯示日期為 05.04.2015。
**dateFormat** - 使用格式 dd.MM.yyyy
示例
在 Eclipse 中開啟專案對映,該對映在使用 numberFormat 對映章節中進行了更新。
使用以下程式碼更新 CarEntity.java −
CarEntity.java
package com.tutorialspoint.entity;
import java.util.GregorianCalendar;
public class CarEntity {
private int id;
private double price;
private GregorianCalendar manufacturingDate;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public double getPrice() {
return price;
}
public void setPrice(double price) {
this.price = price;
}
public GregorianCalendar getManufacturingDate() {
return manufacturingDate;
}
public void setManufacturingDate(GregorianCalendar manufacturingDate) {
this.manufacturingDate = manufacturingDate;
}
}
使用以下程式碼更新 Car.java −
Car.java
package com.tutorialspoint.model;
public class Car {
private int id;
private String price;
private String manufacturingDate;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getPrice() {
return price;
}
public void setPrice(String price) {
this.price = price;
}
public String getManufacturingDate() {
return manufacturingDate;
}
public void setManufacturingDate(String manufacturingDate) {
this.manufacturingDate = manufacturingDate;
}
}
使用以下程式碼更新 CarMapper.java −
CarMapper.java
package com.tutorialspoint.mapper;
import org.mapstruct.Mapper;
import org.mapstruct.Mapping;
import com.tutorialspoint.entity.CarEntity;
import com.tutorialspoint.model.Car;
@Mapper
public interface CarMapper {
@Mapping(source = "price", target = "price", numberFormat = "$#.00")
@Mapping(source = "manufacturingDate", target = "manufacturingDate", dateFormat = "dd.MM.yyyy")
Car getModelFromEntity(CarEntity carEntity);
}
使用以下程式碼更新 CarMapperTest.java −
CarMapperTest.java
package com.tutorialspoint.mapping;
import static org.junit.jupiter.api.Assertions.assertEquals;
import java.util.GregorianCalendar;
import org.junit.jupiter.api.Test;
import org.mapstruct.factory.Mappers;
import com.tutorialspoint.entity.CarEntity;
import com.tutorialspoint.mapper.CarMapper;
import com.tutorialspoint.model.Car;
public class CarMapperTest {
private CarMapper carMapper
= Mappers.getMapper(CarMapper.class);
@Test
public void testEntityToModel() {
CarEntity entity = new CarEntity();
entity.setPrice(345000);
entity.setId(1);
entity.setManufacturingDate(new GregorianCalendar(2015, 3, 5));
Car model = carMapper.getModelFromEntity(entity);
assertEquals(model.getPrice(), "$345000.00");
assertEquals(entity.getId(), model.getId());
assertEquals("05.04.2015", model.getManufacturingDate());
}
}
執行以下命令測試對映。
mvn clean test
命令成功後。驗證輸出。
mvn clean test [INFO] Scanning for projects... ... [INFO] --- maven-surefire-plugin:2.12.4:test (default-test) @ mapping --- [INFO] Surefire report directory: \mvn\mapping\target\surefire-reports ------------------------------------------------------- T E S T S ------------------------------------------------------- Running com.tutorialspoint.mapping.CarMapperTest Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.035 sec Running com.tutorialspoint.mapping.DeliveryAddressMapperTest Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0 sec Running com.tutorialspoint.mapping.StudentMapperTest Tests run: 2, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.001 sec Results : Tests run: 4, Failures: 0, Errors: 0, Skipped: 0 ...
MapStruct - 使用表示式
MapStruct 允許為自定義邏輯呼叫轉換方法。我們可以使用表示式來實現相同的功能,在表示式中我們可以傳遞任何 Java 物件並呼叫其方法進行轉換。
語法
@Mapping(target = "target-property", expression = "java(target-method())")
這裡
目標屬性 - 我們正在進行對映的屬性。
表示式 - 對映器將呼叫表示式中編寫的 Java 方法。
目標方法 - 目標方法是要呼叫的方法。如果方法存在於不同的類中,請使用 new 類名.目標方法()
示例
在 Eclipse 中開啟專案對映,該對映在使用 dateFormat 對映章節中進行了更新。
使用以下程式碼更新 CarEntity.java −
CarEntity.java
package com.tutorialspoint.entity;
import java.util.GregorianCalendar;
public class CarEntity {
private int id;
private double price;
private GregorianCalendar manufacturingDate;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public double getPrice() {
return price;
}
public void setPrice(double price) {
this.price = price;
}
public GregorianCalendar getManufacturingDate() {
return manufacturingDate;
}
public void setManufacturingDate(GregorianCalendar manufacturingDate) {
this.manufacturingDate = manufacturingDate;
}
}
使用以下程式碼更新 Car.java −
Car.java
package com.tutorialspoint.model;
public class Car {
private int id;
private String price;
private String manufacturingDate;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getPrice() {
return price;
}
public void setPrice(String price) {
this.price = price;
}
public String getManufacturingDate() {
return manufacturingDate;
}
public void setManufacturingDate(String manufacturingDate) {
this.manufacturingDate = manufacturingDate;
}
}
使用以下程式碼更新 CarMapper.java −
CarMapper.java
package com.tutorialspoint.mapper;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.GregorianCalendar;
import org.mapstruct.Mapper;
import org.mapstruct.Mapping;
import com.tutorialspoint.entity.CarEntity;
import com.tutorialspoint.model.Car;
@Mapper
public interface CarMapper {
@Mapping(source = "price", target = "price", numberFormat = "$#.00")
@Mapping(target = "manufacturingDate",
expression = "java(getManufacturingDate(carEntity.getManufacturingDate()))")
Car getModelFromEntity(CarEntity carEntity);
default String getManufacturingDate(GregorianCalendar manufacturingDate) {
Date d = manufacturingDate.getTime();
SimpleDateFormat sdf = new SimpleDateFormat( "dd.MM.yyyy" );
return sdf.format( d );
}
}
使用以下程式碼更新 CarMapperTest.java −
CarMapperTest.java
package com.tutorialspoint.mapping;
import static org.junit.jupiter.api.Assertions.assertEquals;
import java.util.GregorianCalendar;
import org.junit.jupiter.api.Test;
import org.mapstruct.factory.Mappers;
import com.tutorialspoint.entity.CarEntity;
import com.tutorialspoint.mapper.CarMapper;
import com.tutorialspoint.model.Car;
public class CarMapperTest {
private CarMapper carMapper
= Mappers.getMapper(CarMapper.class);
@Test
public void testEntityToModel() {
CarEntity entity = new CarEntity();
entity.setPrice(345000);
entity.setId(1);
entity.setManufacturingDate(new GregorianCalendar(2015, 3, 5));
Car model = carMapper.getModelFromEntity(entity);
assertEquals(model.getPrice(), "$345000.00");
assertEquals(entity.getId(), model.getId());
assertEquals("05.04.2015", model.getManufacturingDate());
}
}
執行以下命令測試對映。
mvn clean test
命令成功後。驗證輸出。
mvn clean test [INFO] Scanning for projects... ... [INFO] --- maven-surefire-plugin:2.12.4:test (default-test) @ mapping --- [INFO] Surefire report directory: \mvn\mapping\target\surefire-reports ------------------------------------------------------- T E S T S ------------------------------------------------------- Running com.tutorialspoint.mapping.CarMapperTest Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.035 sec Running com.tutorialspoint.mapping.DeliveryAddressMapperTest Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0 sec Running com.tutorialspoint.mapping.StudentMapperTest Tests run: 2, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.001 sec Results : Tests run: 4, Failures: 0, Errors: 0, Skipped: 0 ...
MapStruct - 使用常量
MapStruct 允許將常量值對映到屬性。
語法
@Mapping(target = "target-property", const = "const-value")
這裡
目標屬性 - 我們正在進行對映的屬性。
常量值 - 對映器將常量值對映到目標屬性。
以下示例演示了相同的功能。
示例
在 Eclipse 中開啟專案對映,該對映在使用 dateFormat 對映章節中進行了更新。
使用以下程式碼更新 CarEntity.java −
CarEntity.java
package com.tutorialspoint.entity;
import java.util.GregorianCalendar;
public class CarEntity {
private int id;
private double price;
private GregorianCalendar manufacturingDate;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public double getPrice() {
return price;
}
public void setPrice(double price) {
this.price = price;
}
public GregorianCalendar getManufacturingDate() {
return manufacturingDate;
}
public void setManufacturingDate(GregorianCalendar manufacturingDate) {
this.manufacturingDate = manufacturingDate;
}
}
使用以下程式碼更新 Car.java −
Car.java
package com.tutorialspoint.model;
public class Car {
private int id;
private String price;
private String manufacturingDate;
private String brand;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getPrice() {
return price;
}
public void setPrice(String price) {
this.price = price;
}
public String getManufacturingDate() {
return manufacturingDate;
}
public void setManufacturingDate(String manufacturingDate) {
this.manufacturingDate = manufacturingDate;
}
public String getBrand() {
return brand;
}
public void setBrand(String brand) {
this.brand = brand;
}
}
使用以下程式碼更新 CarMapper.java −
CarMapper.java
package com.tutorialspoint.mapper;
import org.mapstruct.Mapper;
import org.mapstruct.Mapping;
import com.tutorialspoint.entity.CarEntity;
import com.tutorialspoint.model.Car;
@Mapper
public interface CarMapper {
@Mapping(target = "brand", constant = "BMW")
@Mapping(source = "price", target = "price", numberFormat = "$#.00")
@Mapping(source = "manufacturingDate", target = "manufacturingDate", dateFormat = "dd.MM.yyyy")
Car getModelFromEntity(CarEntity carEntity);
}
使用以下程式碼更新 CarMapperTest.java −
CarMapperTest.java
package com.tutorialspoint.mapping;
import static org.junit.jupiter.api.Assertions.assertEquals;
import java.util.GregorianCalendar;
import org.junit.jupiter.api.Test;
import org.mapstruct.factory.Mappers;
import com.tutorialspoint.entity.CarEntity;
import com.tutorialspoint.mapper.CarMapper;
import com.tutorialspoint.model.Car;
public class CarMapperTest {
private CarMapper carMapper
= Mappers.getMapper(CarMapper.class);
@Test
public void testEntityToModel() {
CarEntity entity = new CarEntity();
entity.setPrice(345000);
entity.setId(1);
entity.setManufacturingDate(new GregorianCalendar(2015, 3, 5));
Car model = carMapper.getModelFromEntity(entity);
assertEquals(model.getPrice(), "$345000.00");
assertEquals(entity.getId(), model.getId());
assertEquals("05.04.2015", model.getManufacturingDate());
assertEquals("BMW", model.getBrand());
}
}
執行以下命令測試對映。
mvn clean test
命令成功後。驗證輸出。
mvn clean test [INFO] Scanning for projects... ... [INFO] --- maven-surefire-plugin:2.12.4:test (default-test) @ mapping --- [INFO] Surefire report directory: \mvn\mapping\target\surefire-reports ------------------------------------------------------- T E S T S ------------------------------------------------------- Running com.tutorialspoint.mapping.CarMapperTest Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.035 sec Running com.tutorialspoint.mapping.DeliveryAddressMapperTest Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0 sec Running com.tutorialspoint.mapping.StudentMapperTest Tests run: 2, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.001 sec Results : Tests run: 4, Failures: 0, Errors: 0, Skipped: 0 ...
MapStruct - 使用 defaultValue
使用 Mapstruct,如果源屬性為 null,我們可以使用 @Mapping 註解的 defaultValue 屬性傳遞預設值。
語法
@Mapping(target = "target-property", source="source-property" defaultValue = "default-value")
這裡
預設值 - 如果源屬性為 null,則目標屬性將設定為預設值。
以下示例演示了相同的功能。
示例
在 Eclipse 中開啟專案對映,該對映在使用 Constant 對映章節中進行了更新。
使用以下程式碼更新 CarEntity.java −
CarEntity.java
package com.tutorialspoint.entity;
import java.util.GregorianCalendar;
public class CarEntity {
private int id;
private double price;
private GregorianCalendar manufacturingDate;
private String name;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public double getPrice() {
return price;
}
public void setPrice(double price) {
this.price = price;
}
public GregorianCalendar getManufacturingDate() {
return manufacturingDate;
}
public void setManufacturingDate(GregorianCalendar manufacturingDate) {
this.manufacturingDate = manufacturingDate;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
使用以下程式碼更新 Car.java −
Car.java
package com.tutorialspoint.model;
public class Car {
private int id;
private String price;
private String manufacturingDate;
private String brand;
private String name;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getPrice() {
return price;
}
public void setPrice(String price) {
this.price = price;
}
public String getManufacturingDate() {
return manufacturingDate;
}
public void setManufacturingDate(String manufacturingDate) {
this.manufacturingDate = manufacturingDate;
}
public String getBrand() {
return brand;
}
public void setBrand(String brand) {
this.brand = brand;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
使用以下程式碼更新 CarMapper.java −
CarMapper.java
package com.tutorialspoint.mapper;
import org.mapstruct.Mapper;
import org.mapstruct.Mapping;
import com.tutorialspoint.entity.CarEntity;
import com.tutorialspoint.model.Car;
@Mapper
public interface CarMapper {
@Mapping(source = "name", target = "name", defaultValue = "Sample")
@Mapping(target = "brand", constant = "BMW")
@Mapping(source = "price", target = "price", numberFormat = "$#.00")
@Mapping(source = "manufacturingDate", target = "manufacturingDate", dateFormat = "dd.MM.yyyy")
Car getModelFromEntity(CarEntity carEntity);
}
使用以下程式碼更新 CarMapperTest.java −
CarMapperTest.java
package com.tutorialspoint.mapping;
import static org.junit.jupiter.api.Assertions.assertEquals;
import java.util.GregorianCalendar;
import org.junit.jupiter.api.Test;
import org.mapstruct.factory.Mappers;
import com.tutorialspoint.entity.CarEntity;
import com.tutorialspoint.mapper.CarMapper;
import com.tutorialspoint.model.Car;
public class CarMapperTest {
private CarMapper carMapper
= Mappers.getMapper(CarMapper.class);
@Test
public void testEntityToModel() {
CarEntity entity = new CarEntity();
entity.setPrice(345000);
entity.setId(1);
entity.setManufacturingDate(new GregorianCalendar(2015, 3, 5));
Car model = carMapper.getModelFromEntity(entity);
assertEquals(model.getPrice(), "$345000.00");
assertEquals(entity.getId(), model.getId());
assertEquals("05.04.2015", model.getManufacturingDate());
assertEquals("Sample", model.getName());
assertEquals("BMW", model.getBrand());
}
}
執行以下命令測試對映。
mvn clean test
命令成功後。驗證輸出。
mvn clean test [INFO] Scanning for projects... ... [INFO] --- maven-surefire-plugin:2.12.4:test (default-test) @ mapping --- [INFO] Surefire report directory: \mvn\mapping\target\surefire-reports ------------------------------------------------------- T E S T S ------------------------------------------------------- Running com.tutorialspoint.mapping.CarMapperTest Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.035 sec Running com.tutorialspoint.mapping.DeliveryAddressMapperTest Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0 sec Running com.tutorialspoint.mapping.StudentMapperTest Tests run: 2, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.001 sec Results : Tests run: 4, Failures: 0, Errors: 0, Skipped: 0 ...
MapStruct - 使用 defaultExpression
使用 Mapstruct,如果源屬性為 null,我們可以使用 @Mapping 註解的 defaultExpression 屬性傳遞計算值。
語法
@Mapping(target = "target-property", source="source-property" defaultExpression = "default-value-method")
這裡
預設值方法 - 如果源屬性為 null,則目標屬性將設定為預設值方法的結果。
以下示例演示了相同的功能。
示例
在 Eclipse 中開啟專案對映,該對映在使用 defaultValue 對映章節中進行了更新。
使用以下程式碼更新 CarEntity.java −
CarEntity.java
package com.tutorialspoint.entity;
import java.util.GregorianCalendar;
public class CarEntity {
private int id;
private double price;
private GregorianCalendar manufacturingDate;
private String name;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public double getPrice() {
return price;
}
public void setPrice(double price) {
this.price = price;
}
public GregorianCalendar getManufacturingDate() {
return manufacturingDate;
}
public void setManufacturingDate(GregorianCalendar manufacturingDate) {
this.manufacturingDate = manufacturingDate;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
使用以下程式碼更新 Car.java −
Car.java
package com.tutorialspoint.model;
public class Car {
private int id;
private String price;
private String manufacturingDate;
private String brand;
private String name;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getPrice() {
return price;
}
public void setPrice(String price) {
this.price = price;
}
public String getManufacturingDate() {
return manufacturingDate;
}
public void setManufacturingDate(String manufacturingDate) {
this.manufacturingDate = manufacturingDate;
}
public String getBrand() {
return brand;
}
public void setBrand(String brand) {
this.brand = brand;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
使用以下程式碼更新 CarMapper.java −
CarMapper.java
package com.tutorialspoint.mapper;
import org.mapstruct.Mapper;
import org.mapstruct.Mapping;
import com.tutorialspoint.entity.CarEntity;
import com.tutorialspoint.model.Car;
import java.util.UUID;
@Mapper( imports = UUID.class )
public interface CarMapper {
@Mapping(source = "name", target = "name", defaultExpression = "java(UUID.randomUUID().toString())")
@Mapping(target = "brand", constant = "BMW")
@Mapping(source = "price", target = "price", numberFormat = "$#.00")
@Mapping(source = "manufacturingDate", target = "manufacturingDate", dateFormat = "dd.MM.yyyy")
Car getModelFromEntity(CarEntity carEntity);
}
使用以下程式碼更新 CarMapperTest.java −
CarMapperTest.java
package com.tutorialspoint.mapping;
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertNotNull;
import java.util.GregorianCalendar;
import org.junit.jupiter.api.Test;
import org.mapstruct.factory.Mappers;
import com.tutorialspoint.entity.CarEntity;
import com.tutorialspoint.mapper.CarMapper;
import com.tutorialspoint.model.Car;
public class CarMapperTest {
private CarMapper carMapper=Mappers.getMapper(CarMapper.class);
@Test
public void testEntityToModel() {
CarEntity entity = new CarEntity();
entity.setPrice(345000);
entity.setId(1);
entity.setManufacturingDate(new GregorianCalendar(2015, 3, 5));
Car model = carMapper.getModelFromEntity(entity);
assertEquals(model.getPrice(), "$345000.00");
assertEquals(entity.getId(), model.getId());
assertEquals("05.04.2015", model.getManufacturingDate());
assertNotNull(model.getName());
assertEquals("BMW", model.getBrand());
}
}
執行以下命令測試對映。
mvn clean test
輸出
命令成功後。驗證輸出。
mvn clean test [INFO] Scanning for projects... ... [INFO] --- maven-surefire-plugin:2.12.4:test (default-test) @ mapping --- [INFO] Surefire report directory: \mvn\mapping\target\surefire-reports ------------------------------------------------------- T E S T S ------------------------------------------------------- Running com.tutorialspoint.mapping.CarMapperTest Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.035 sec Running com.tutorialspoint.mapping.DeliveryAddressMapperTest Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0 sec Running com.tutorialspoint.mapping.StudentMapperTest Tests run: 2, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.001 sec Results : Tests run: 4, Failures: 0, Errors: 0, Skipped: 0 ...
MapStruct - 列表對映
使用 Mapstruct,我們可以像對映基本型別一樣對映列表。要獲取物件列表,我們應該提供一個可以對映物件的對映器方法。
語法
@Mapper
public interface CarMapper {
List<String> getListOfStrings(List<Integer> listOfIntegers);
List<Car> getCars(List<CarEntity> carEntities);
Car getModelFromEntity(CarEntity carEntity);
}
以下示例演示了相同的功能。
示例
在 Eclipse 中開啟專案對映,該對映在使用 defaultExpression 對映章節中進行了更新。
使用以下程式碼更新 CarEntity.java −
CarEntity.java
package com.tutorialspoint.entity;
import java.util.GregorianCalendar;
public class CarEntity {
private int id;
private double price;
private GregorianCalendar manufacturingDate;
private String name;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public double getPrice() {
return price;
}
public void setPrice(double price) {
this.price = price;
}
public GregorianCalendar getManufacturingDate() {
return manufacturingDate;
}
public void setManufacturingDate(GregorianCalendar manufacturingDate) {
this.manufacturingDate = manufacturingDate;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
使用以下程式碼更新 Car.java −
Car.java
package com.tutorialspoint.model;
public class Car {
private int id;
private String price;
private String manufacturingDate;
private String brand;
private String name;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getPrice() {
return price;
}
public void setPrice(String price) {
this.price = price;
}
public String getManufacturingDate() {
return manufacturingDate;
}
public void setManufacturingDate(String manufacturingDate) {
this.manufacturingDate = manufacturingDate;
}
public String getBrand() {
return brand;
}
public void setBrand(String brand) {
this.brand = brand;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
使用以下程式碼更新 CarMapper.java −
CarMapper.java
package com.tutorialspoint.mapper;
import org.mapstruct.Mapper;
import org.mapstruct.Mapping;
import com.tutorialspoint.entity.CarEntity;
import com.tutorialspoint.model.Car;
import java.util.List;
import java.util.UUID;
@Mapper( imports = UUID.class )
public interface CarMapper {
@Mapping(source = "name", target = "name", defaultExpression = "java(UUID.randomUUID().toString())")
@Mapping(target = "brand", constant = "BMW")
@Mapping(source = "price", target = "price", numberFormat = "$#.00")
@Mapping(source = "manufacturingDate", target = "manufacturingDate", dateFormat = "dd.MM.yyyy")
Car getModelFromEntity(CarEntity carEntity);
List<String> getListOfStrings(List<Integer> listOfIntegers);
List<Car> getCars(List<CarEntity> carEntities);
}
使用以下程式碼更新 CarMapperTest.java −
CarMapperTest.java
package com.tutorialspoint.mapping;
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertNotNull;
import java.util.Arrays;
import java.util.GregorianCalendar;
import java.util.List;
import org.junit.jupiter.api.Test;
import org.mapstruct.factory.Mappers;
import com.tutorialspoint.entity.CarEntity;
import com.tutorialspoint.mapper.CarMapper;
import com.tutorialspoint.model.Car;
public class CarMapperTest {
private CarMapper carMapper
= Mappers.getMapper(CarMapper.class);
@Test
public void testEntityToModel() {
CarEntity entity = new CarEntity();
entity.setPrice(345000);
entity.setId(1);
entity.setManufacturingDate(new GregorianCalendar(2015, 3, 5));
CarEntity entity1 = new CarEntity();
entity1.setPrice(445000);
entity1.setId(2);
entity1.setManufacturingDate(new GregorianCalendar(2015, 3, 5));
List<CarEntity> carEntities = Arrays.asList(entity, entity1);
Car model = carMapper.getModelFromEntity(entity);
assertEquals("$345000.00",model.getPrice());
assertEquals(entity.getId(), model.getId());
assertEquals("BMW", model.getBrand());
assertEquals("05.04.2015", model.getManufacturingDate());
List<Integer> list = Arrays.asList(1,2,3);
List<String> listOfStrings = carMapper.getListOfStrings(list);
List<Car> listOfCars = carMapper.getCars(carEntities);
assertEquals(3, listOfStrings.size());
assertEquals(2, listOfCars.size());
}
}
執行以下命令測試對映。
mvn clean test
命令成功後。驗證輸出。
mvn clean test [INFO] Scanning for projects... ... [INFO] --- maven-surefire-plugin:2.12.4:test (default-test) @ mapping --- [INFO] Surefire report directory: \mvn\mapping\target\surefire-reports ------------------------------------------------------- T E S T S ------------------------------------------------------- Running com.tutorialspoint.mapping.CarMapperTest Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.035 sec Running com.tutorialspoint.mapping.DeliveryAddressMapperTest Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0 sec Running com.tutorialspoint.mapping.StudentMapperTest Tests run: 2, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.001 sec Results : Tests run: 4, Failures: 0, Errors: 0, Skipped: 0 ...
MapStruct - Map 對映
使用 Mapstruct,我們可以使用 @MapMapping 註解建立對映物件。其他對映規則與我們之前看到的相同。
語法
@Mapper
public interface UtilityMapper {
@MapMapping(valueDateFormat = "dd.MM.yyyy")
Map<String, String> getMap(Map<Long, GregorianCalendar> source);
}
以下示例演示了相同的功能。
示例
在 Eclipse 中開啟專案對映,該對映在對映列表章節中進行了更新。
使用以下程式碼建立 UtilityMapper.java −
UtilityMapper.java
package com.tutorialspoint.mapper;
import java.util.GregorianCalendar;
import java.util.Map;
import org.mapstruct.MapMapping;
import org.mapstruct.Mapper;
@Mapper
public interface UtilityMapper {
@MapMapping(valueDateFormat = "dd.MM.yyyy")
Map<String, String> getMap(Map<Long, GregorianCalendar> source);
}
使用以下程式碼建立 UtilityMapperTest.java −
UtilityMapperTest.java
package com.tutorialspoint.mapping;
import static org.junit.jupiter.api.Assertions.assertEquals;
import java.util.GregorianCalendar;
import java.util.HashMap;
import java.util.Map;
import org.junit.jupiter.api.Test;
import org.mapstruct.factory.Mappers;
import com.tutorialspoint.mapper.UtilityMapper;
public class UtilityMapperTest {
private UtilityMapper utilityMapper
= Mappers.getMapper(UtilityMapper.class);
@Test
public void testMapMapping() {
Map<Long, GregorianCalendar> source = new HashMap<>();
source.put(1L, new GregorianCalendar(2015, 3, 5));
Map<String, String> target = utilityMapper.getMap(source);
assertEquals("05.04.2015", target.get("1"));
}
}
執行以下命令測試對映。
mvn clean test
命令成功後。驗證輸出。
mvn clean test [INFO] Scanning for projects... ... [INFO] --- maven-surefire-plugin:2.12.4:test (default-test) @ mapping --- [INFO] Surefire report directory: \mvn\mapping\target\surefire-reports ------------------------------------------------------- T E S T S ------------------------------------------------------- Running com.tutorialspoint.mapping.CarMapperTest Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.327 sec Running com.tutorialspoint.mapping.DeliveryAddressMapperTest Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.001 sec Running com.tutorialspoint.mapping.StudentMapperTest Tests run: 2, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.001 sec Running com.tutorialspoint.mapping.UtilityMapperTest Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.001 sec Results : Tests run: 5, Failures: 0, Errors: 0, Skipped: 0 ...
MapStruct - 對映流
使用 Mapstruct,我們可以像處理集合一樣建立流的對映。
語法
@Mapper
public interface UtilityMapper {
Stream<String> getStream(Stream<Integer> source);
}
以下示例演示了相同的功能。
示例
在 Eclipse 中開啟專案對映,該對映在對映對映章節中進行了更新。
使用以下程式碼更新 UtilityMapper.java −
UtilityMapper.java
package com.tutorialspoint.mapper;
import java.util.GregorianCalendar;
import java.util.Map;
import java.util.stream.Stream;
import org.mapstruct.MapMapping;
import org.mapstruct.Mapper;
@Mapper
public interface UtilityMapper {
@MapMapping(valueDateFormat = "dd.MM.yyyy")
Map<String, String> getMap(Map<Long, GregorianCalendar> source);
Stream<String> getStream(Stream<Integer> source);
}
使用以下程式碼更新 UtilityMapperTest.java −
UtilityMapperTest.java
package com.tutorialspoint.mapping;
import static org.junit.jupiter.api.Assertions.assertEquals;
import java.util.Arrays;
import java.util.GregorianCalendar;
import java.util.HashMap;
import java.util.Map;
import java.util.stream.Stream;
import org.junit.jupiter.api.Test;
import org.mapstruct.factory.Mappers;
import com.tutorialspoint.mapper.UtilityMapper;
public class UtilityMapperTest {
private UtilityMapper utilityMapper=Mappers.getMapper(UtilityMapper.class);
@Test
public void testMapMapping() {
Map<Long, GregorianCalendar> source = new HashMap<>();
source.put(1L, new GregorianCalendar(2015, 3, 5));
Map<String, String> target = utilityMapper.getMap(source);
assertEquals("05.04.2015", target.get("1"));
}
@Test
public void testGetStream() {
Stream<Integer> numbers = Arrays.asList(1, 2, 3, 4).stream();
Stream<String> strings = utilityMapper.getStream(numbers);
assertEquals(4, strings.count());
}
}
執行以下命令測試對映。
mvn clean test
輸出
命令成功後。驗證輸出。
mvn clean test [INFO] Scanning for projects... ... [INFO] --- maven-surefire-plugin:2.12.4:test (default-test) @ mapping --- [INFO] Surefire report directory: \mvn\mapping\target\surefire-reports ------------------------------------------------------- T E S T S ------------------------------------------------------- Running com.tutorialspoint.mapping.CarMapperTest Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.327 sec Running com.tutorialspoint.mapping.DeliveryAddressMapperTest Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.001 sec Running com.tutorialspoint.mapping.StudentMapperTest Tests run: 2, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.001 sec Running com.tutorialspoint.mapping.UtilityMapperTest Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.001 sec Results : Tests run: 5, Failures: 0, Errors: 0, Skipped: 0 ...
MapStruct - 列舉對映
Mapstruct 自動對映列舉。名稱相同的列舉會自動對映。如果名稱不同,我們可以使用 @ValueMapping 註解進行對映。
語法
@Mapper
public interface UtilityMapper {
@ValueMapping(source = "EXTRA", target = "SPECIAL")
PlacedOrderType getEnum(OrderType order);
}
以下示例演示了相同的功能。
示例
在 Eclipse 中開啟專案對映,該對映在對映流章節中進行了更新。
使用以下程式碼建立 OrderType.java −
OrderType.java
package com.tutorialspoint.enums;
public enum OrderType {
EXTRA, NORMAL, STANDARD
}
使用以下程式碼建立 PlacedOrderType.java −
PlacedOrderType.java
package com.tutorialspoint.enums;
public enum PlacedOrderType {
SPECIAL, NORMAL, STANDARD
}
使用以下程式碼更新 UtilityMapper.java −
UtilityMapper.java
package com.tutorialspoint.mapper;
import java.util.GregorianCalendar;
import java.util.Map;
import java.util.stream.Stream;
import org.mapstruct.MapMapping;
import org.mapstruct.Mapper;
import org.mapstruct.ValueMapping;
import com.tutorialspoint.enums.OrderType;
import com.tutorialspoint.enums.PlacedOrderType;
@Mapper
public interface UtilityMapper {
@MapMapping(valueDateFormat = "dd.MM.yyyy")
Map<String, String> getMap(Map<Long, GregorianCalendar> source);
Stream<String> getStream(Stream<Integer> source);
@ValueMapping(source = "EXTRA", target = "SPECIAL")
PlacedOrderType getEnum(OrderType order);
}
使用以下程式碼更新 UtilityMapperTest.java −
UtilityMapperTest.java
package com.tutorialspoint.mapping;
import static org.junit.jupiter.api.Assertions.assertEquals;
import java.util.Arrays;
import java.util.GregorianCalendar;
import java.util.HashMap;
import java.util.Map;
import java.util.stream.Stream;
import org.junit.jupiter.api.Test;
import org.mapstruct.factory.Mappers;
import com.tutorialspoint.enums.OrderType;
import com.tutorialspoint.enums.PlacedOrderType;
import com.tutorialspoint.mapper.UtilityMapper;
public class UtilityMapperTest {
private UtilityMapper utilityMapper=Mappers.getMapper(UtilityMapper.class);
@Test
public void testMapMapping() {
Map<Long, GregorianCalendar> source = new HashMap<>();
source.put(1L, new GregorianCalendar(2015, 3, 5));
Map<String, String> target = utilityMapper.getMap(source);
assertEquals("05.04.2015", target.get("1"));
}
@Test
public void testGetStream() {
Stream<Integer> numbers = Arrays.asList(1, 2, 3, 4).stream();
Stream<String> strings = utilityMapper.getStream(numbers);
assertEquals(4, strings.count());
}
@Test
public void testGetEnum() {
PlacedOrderType placedOrderType = utilityMapper.getEnum(OrderType.EXTRA);
PlacedOrderType placedOrderType1 = utilityMapper.getEnum(OrderType.NORMAL);
PlacedOrderType placedOrderType2 = utilityMapper.getEnum(OrderType.STANDARD);
assertEquals(PlacedOrderType.SPECIAL.name(), placedOrderType.name());
assertEquals(PlacedOrderType.NORMAL.name(), placedOrderType1.name());
assertEquals(PlacedOrderType.STANDARD.name(), placedOrderType2.name());
}
}
執行以下命令測試對映。
mvn clean test
輸出
命令成功後。驗證輸出。
mvn clean test [INFO] Scanning for projects... ... [INFO] --- maven-surefire-plugin:2.12.4:test (default-test) @ mapping --- [INFO] Surefire report directory: \mvn\mapping\target\surefire-reports ------------------------------------------------------- T E S T S ------------------------------------------------------- Running com.tutorialspoint.mapping.CarMapperTest Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.256 sec Running com.tutorialspoint.mapping.DeliveryAddressMapperTest Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.001 sec Running com.tutorialspoint.mapping.StudentMapperTest Tests run: 2, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0 sec Running com.tutorialspoint.mapping.UtilityMapperTest Tests run: 3, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0 sec Results : Tests run: 7, Failures: 0, Errors: 0, Skipped: 0 ...
MapStruct - 丟擲異常
Mapstruct 對映器允許丟擲特定異常。考慮自定義對映方法的情況,如果資料無效,我們希望丟擲自定義異常。
語法
@Mapper(uses=DateMapper.class)
public interface UtilityMapper {
CarEntity getCarEntity(Car car) throws ParseException;
}
以下示例演示了相同的功能。
示例
在 Eclipse 中開啟專案對映,該對映在對映列舉章節中進行了更新。
使用以下程式碼更新 UtilityMapper.java −
UtilityMapper.java
package com.tutorialspoint.mapper;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.GregorianCalendar;
import java.util.Map;
import java.util.stream.Stream;
import org.mapstruct.MapMapping;
import org.mapstruct.Mapper;
import org.mapstruct.ValueMapping;
import com.tutorialspoint.entity.CarEntity;
import com.tutorialspoint.enums.OrderType;
import com.tutorialspoint.enums.PlacedOrderType;
import com.tutorialspoint.model.Car;
@Mapper(uses=DateMapper.class)
public interface UtilityMapper {
@MapMapping(valueDateFormat = "dd.MM.yyyy")
Map<String, String> getMap(Map<Long, GregorianCalendar> source);
Stream<String> getStream(Stream<Integer> source);
@ValueMapping(source = "EXTRA", target = "SPECIAL")
PlacedOrderType getEnum(OrderType order);
CarEntity getCarEntity(Car car) throws ParseException;
}
class DateMapper {
public String asString(GregorianCalendar date) {
return date != null ? new SimpleDateFormat( "yyyy-MM-dd" )
.format( date.getTime() ) : null;
}
public GregorianCalendar asDate(String date) throws ParseException {
Date date1 = date != null ? new SimpleDateFormat( "yyyy-MM-dd" )
.parse( date ) : null;
if(date1 != null) {
return new GregorianCalendar(date1.getYear(), date1.getMonth(),date1.getDay());
}
return null;
}
}
使用以下程式碼更新 UtilityMapperTest.java −
UtilityMapperTest.java
package com.tutorialspoint.mapping;
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertTrue;
import java.text.ParseException;
import java.util.Arrays;
import java.util.GregorianCalendar;
import java.util.HashMap;
import java.util.Map;
import java.util.stream.Stream;
import org.junit.jupiter.api.Test;
import org.mapstruct.factory.Mappers;
import com.tutorialspoint.entity.CarEntity;
import com.tutorialspoint.enums.OrderType;
import com.tutorialspoint.enums.PlacedOrderType;
import com.tutorialspoint.mapper.UtilityMapper;
import com.tutorialspoint.model.Car;
public class UtilityMapperTest {
private UtilityMapper utilityMapper
= Mappers.getMapper(UtilityMapper.class);
@Test
public void testMapMapping() {
Map<Long, GregorianCalendar> source = new HashMap<>();
source.put(1L, new GregorianCalendar(2015, 3, 5));
Map<String, String> target = utilityMapper.getMap(source);
assertEquals("2015-04-05", target.get("1"));
}
@Test
public void testGetStream() {
Stream<Integer> numbers = Arrays.asList(1, 2, 3, 4).stream();
Stream<String> strings = utilityMapper.getStream(numbers);
assertEquals(4, strings.count());
}
@Test
public void testGetEnum() {
PlacedOrderType placedOrderType = utilityMapper.getEnum(OrderType.EXTRA);
PlacedOrderType placedOrderType1 = utilityMapper.getEnum(OrderType.NORMAL);
PlacedOrderType placedOrderType2 = utilityMapper.getEnum(OrderType.STANDARD);
assertEquals(PlacedOrderType.SPECIAL.name(), placedOrderType.name());
assertEquals(PlacedOrderType.NORMAL.name(), placedOrderType1.name());
assertEquals(PlacedOrderType.STANDARD.name(), placedOrderType2.name());
}
@Test
public void testGetCar() {
Car car = new Car();
car.setId(1);
car.setManufacturingDate("11/10/2020");
boolean exceptionOccured = false;
try {
CarEntity carEntity = utilityMapper.getCarEntity(car);
} catch (ParseException e) {
exceptionOccured = true;
}
assertTrue(exceptionOccured);
}
}
執行以下命令測試對映。
mvn clean test
命令成功後。驗證輸出。
mvn clean test [INFO] Scanning for projects... ... [INFO] --- maven-surefire-plugin:2.12.4:test (default-test) @ mapping --- [INFO] Surefire report directory: \mvn\mapping\target\surefire-reports ------------------------------------------------------- T E S T S ------------------------------------------------------- Running com.tutorialspoint.mapping.CarMapperTest Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.256 sec Running com.tutorialspoint.mapping.DeliveryAddressMapperTest Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.001 sec Running com.tutorialspoint.mapping.StudentMapperTest Tests run: 2, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0 sec Running com.tutorialspoint.mapping.UtilityMapperTest Tests run: 4, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0 sec Results : Tests run: 8, Failures: 0, Errors: 0, Skipped: 0 ...
MapStruct - 使用自定義對映器
Mapstruct 對映器允許建立自定義對映器方法來對映物件。對於對映器介面,我們可以新增預設方法。
語法
@Mapper(uses=DateMapper.class)
public interface UtilityMapper {
default Car getCar(CarEntity entity) {
Car car = new Car();
car.setId(entity.getId());
car.setName(entity.getName());
return car;
}
}
以下示例演示了相同的功能。
示例
在 Eclipse 中開啟專案對映,該對映在對映列舉章節中進行了更新。
使用以下程式碼更新 UtilityMapper.java −
UtilityMapper.java
package com.tutorialspoint.mapper;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.GregorianCalendar;
import java.util.Map;
import java.util.stream.Stream;
import org.mapstruct.MapMapping;
import org.mapstruct.Mapper;
import org.mapstruct.ValueMapping;
import com.tutorialspoint.entity.CarEntity;
import com.tutorialspoint.enums.OrderType;
import com.tutorialspoint.enums.PlacedOrderType;
import com.tutorialspoint.model.Car;
@Mapper(uses=DateMapper.class)
public interface UtilityMapper {
@MapMapping(valueDateFormat = "dd.MM.yyyy")
Map<String, String> getMap(Map<Long, GregorianCalendar> source);
Stream<String> getStream(Stream<Integer> source);
@ValueMapping(source = "EXTRA", target = "SPECIAL")
PlacedOrderType getEnum(OrderType order);
CarEntity getCarEntity(Car car) throws ParseException;
default Car getCar(CarEntity entity) {
Car car = new Car();
car.setId(entity.getId());
car.setName(entity.getName());
return car;
}
}
class DateMapper {
public String asString(GregorianCalendar date) {
return date != null ? new SimpleDateFormat( "yyyy-MM-dd" )
.format( date.getTime() ) : null;
}
public GregorianCalendar asDate(String date) throws ParseException {
Date date1 = date != null ? new SimpleDateFormat( "yyyy-MM-dd" )
.parse( date ) : null;
if(date1 != null) {
return new GregorianCalendar(date1.getYear(), date1.getMonth(),date1.getDay());
}
return null;
}
}
使用以下程式碼更新 UtilityMapperTest.java −
UtilityMapperTest.java
package com.tutorialspoint.mapping;
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertTrue;
import java.text.ParseException;
import java.util.Arrays;
import java.util.GregorianCalendar;
import java.util.HashMap;
import java.util.Map;
import java.util.stream.Stream;
import org.junit.jupiter.api.Test;
import org.mapstruct.factory.Mappers;
import com.tutorialspoint.entity.CarEntity;
import com.tutorialspoint.enums.OrderType;
import com.tutorialspoint.enums.PlacedOrderType;
import com.tutorialspoint.mapper.UtilityMapper;
import com.tutorialspoint.model.Car;
public class UtilityMapperTest {
private UtilityMapper utilityMapper
= Mappers.getMapper(UtilityMapper.class);
@Test
public void testMapMapping() {
Map<Long, GregorianCalendar> source = new HashMap<>();
source.put(1L, new GregorianCalendar(2015, 3, 5));
Map<String, String> target = utilityMapper.getMap(source);
assertEquals("2015-04-05", target.get("1"));
}
@Test
public void testGetStream() {
Stream<Integer> numbers = Arrays.asList(1, 2, 3, 4).stream();
Stream<String> strings = utilityMapper.getStream(numbers);
assertEquals(4, strings.count());
}
@Test
public void testGetEnum() {
PlacedOrderType placedOrderType = utilityMapper.getEnum(OrderType.EXTRA);
PlacedOrderType placedOrderType1 = utilityMapper.getEnum(OrderType.NORMAL);
PlacedOrderType placedOrderType2 = utilityMapper.getEnum(OrderType.STANDARD);
assertEquals(PlacedOrderType.SPECIAL.name(), placedOrderType.name());
assertEquals(PlacedOrderType.NORMAL.name(), placedOrderType1.name());
assertEquals(PlacedOrderType.STANDARD.name(), placedOrderType2.name());
}
@Test
public void testGetCarEntity() {
Car car = new Car();
car.setId(1);
car.setManufacturingDate("11/10/2020");
boolean exceptionOccured = false;
try {
CarEntity carEntity = utilityMapper.getCarEntity(car);
} catch (ParseException e) {
exceptionOccured = true;
}
assertTrue(exceptionOccured);
}
@Test
public void testGetCar() {
CarEntity entity = new CarEntity();
entity.setId(1);
entity.setName("ZEN");
Car car = utilityMapper.getCar(entity);
assertEquals(entity.getId(), car.getId());
assertEquals(entity.getName(), car.getName());
}
}
執行以下命令測試對映。
mvn clean test
命令成功後。驗證輸出。
mvn clean test [INFO] Scanning for projects... ... [INFO] --- maven-surefire-plugin:2.12.4:test (default-test) @ mapping --- [INFO] Surefire report directory: \mvn\mapping\target\surefire-reports ------------------------------------------------------- T E S T S ------------------------------------------------------- Running com.tutorialspoint.mapping.CarMapperTest Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.256 sec Running com.tutorialspoint.mapping.DeliveryAddressMapperTest Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.001 sec Running com.tutorialspoint.mapping.StudentMapperTest Tests run: 2, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0 sec Running com.tutorialspoint.mapping.UtilityMapperTest Tests run: 5, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0 sec Results : Tests run: 9, Failures: 0, Errors: 0, Skipped: 0 ...