將 MapStruct 與 Lombok 結合使用
1. 概述
Project Lombok 是一個有助於樣板程式碼的函式庫,使我們能夠更專注於核心應用程式邏輯。
類似地,當我們需要兩個 Java bean 之間的對應時,MapStruct 是另一個可以幫助使用樣板檔案的函式庫。
在本教程中,我們將研究如何有效地一起使用這兩個庫。
2. 設定
讓我們將[mapstruct](https://mvnrepository.com/artifact/org.mapstruct/mapstruct)
、 [lombok](https://mvnrepository.com/artifact/org.projectlombok/lombok)
和[lombok-mapstruct-binding](https://mvnrepository.com/artifact/org.projectlombok/lombok-mapstruct-binding)
依賴項加入pom.xml
:
<dependency>
<groupId>org.mapstruct</groupId>
<artifactId>mapstruct</artifactId>
<version>1.6.0.Beta2</version>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.32</version>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok-mapstruct-binding</artifactId>
<version>0.2.0</version>
</dependency>
3.MapStruct和Lombok集成
我們將在我們的設定中使用@Builder
和@Data
Lombok 註解。前者允許透過 Builder 模式建立對象,而後者則透過 setter 提供基於建構函數的物件建立。
3.1. Java POJO 設定
現在,讓我們開始為我們的映射器定義一個簡單的來源類別:
@Data
public class SimpleSource {
private String name;
private String description;
}
接下來,我們為映射器定義一個簡單的目標類別:
@Data
public class SimpleDestination {
private String name;
private String description;
}
最後,我們還將定義另一個目標類,但使用@Builder
Lombok 註解:
@Builder
@Getter
public class LombokDestination {
private String name;
private String description;
}
3.2.使用@Mapper
註解
當我們使用@Mapper
註解時,MapStruct會自動建立映射器實作。
讓我們定義映射器介面:
@Mapper
public interface LombokMapper {
SimpleDestination sourceToDestination(SimpleSource source);
LombokDestination sourceToLombokDestination(SimpleSource source);
}
當我們執行mvn clean install
指令時,會在/target/generated-sources/annotations/
資料夾下建立映射器實作類別。
我們來看看產生的實作類別:
public class LombokMapperImpl implements LombokMapper {
@Override
public SimpleDestination sourceToDestination(SimpleSource source) {
if ( source == null ) {
return null;
}
SimpleDestination simpleDestination = new SimpleDestination();
simpleDestination.setName( source.getName() );
simpleDestination.setDescription( source.getDescription() );
return simpleDestination;
}
@Override
public LombokDestination sourceToLombokDestination(SimpleSource source) {
if ( source == null ) {
return null;
}
LombokDestination.LombokDestinationBuilder lombokDestination = LombokDestination.builder();
lombokDestination.name( source.getName() );
lombokDestination.description( source.getDescription() );
return lombokDestination.build();
}
}
正如我們在這裡看到的,該實作有兩種將來源物件映射到不同目標的方法。然而,主要的區別在於目標物件的建構方式。
此實作使用LombokDestination
類別的builder()
方法。另一方面,它使用構造函數創建SimpleDestination
對象,並使用設定器來映射變數。
3.3.測試用例
現在,讓我們來看看一個簡單的測試案例來查看映射器的實作:
@Test
void whenDestinationIsMapped_thenIsSuccessful() {
SimpleSource simpleSource = new SimpleSource();
simpleSource.setName("file");
simpleSource.setDescription("A text file.");
SimpleDestination simpleDestination = lombokMapper.sourceToDestination(simpleSource);
Assertions.assertNotNull(simpleDestination);
Assertions.assertEquals(simpleSource.getName(), simpleDestination.getName());
Assertions.assertEquals(simpleSource.getDescription(), simpleDestination.getDescription());
LombokDestination lombokDestination = lombokMapper.sourceToLombokDestination(simpleSource);
Assertions.assertNotNull(lombokDestination);
Assertions.assertEquals(simpleSource.getName(), lombokDestination.getName());
Assertions.assertEquals(simpleSource.getDescription(), lombokDestination.getDescription());
}
正如我們在上面的測試案例中可以驗證的那樣,映射器實現成功地將來源 POJO 映射到兩個目標 POJO。
4。
在本文中,我們了解如何結合使用 MapStruct 和 Lombok 來幫助我們減少樣板程式碼的編寫,從而增強程式碼的可讀性並提高開發過程的效率。
我們研究如何在從一個 POJO 對應到另一個 POJO 時將@Builder
和@Data
Lombok 註釋與 MapStruct 結合使用。
像往常一樣,可以在 GitHub 上找到程式碼。