Spring Boot MapStruct 快速拷貝方案選擇
MapStruct
是一個用於生成型別安全,高效能和無依賴的bean對映程式碼的註釋處理器。競爭對手是Selma
。
專案地址:gitee.com/SoftMeng/sp…
介紹
MapStruct是一個Java 註釋處理器,用於生成型別安全的bean對映類。
您所要做的就是定義一個mapper介面,該介面宣告任何所需的對映方法。在編譯期間,MapStruct將生成此介面的實現。此實現使用普通的Java方法呼叫來在源物件和目標物件之間進行對映,即沒有反射或類似。
與手工編寫對映程式碼相比,MapStruct通過生成繁瑣且易於編寫的程式碼來節省時間。遵循約定優於配置方法,MapStruct使用合理的預設值,但在配置或實現特殊行為時會採取措施。
與動態對映框架相比,MapStruct具有以下優勢:
-
通過使用普通方法呼叫而不是反射來快速執行
-
編譯時型別安全:只能對映相互對映的物件和屬性,不會將訂單實體意外對映到客戶DTO等。
-
在構建時清除錯誤報告,如果
-
對映不完整(並非所有目標屬性都已對映)
-
對映不正確(找不到合適的對映方法或型別轉換)
-
元件介紹
mapstruct
包含所需的註釋,例如@Mapping
<dependency>
<groupId>org.mapstruct</groupId>
<artifactId>mapstruct</artifactId >
<version>1.3.0.Final</version>
</dependency>
複製程式碼
mapstruct-processor
在編譯,生成對映器實現的註釋處理器,配置在pom.xml中build編譯外掛中。
<path>
<groupId>org.mapstruct</groupId>
<artifactId>mapstruct-processor</artifactId>
<version>1.3.0.Final</version >
</path>
複製程式碼
IntelliJ IDEA
和Eclipse IDE
-
IntelliJ IDEA
可以配置對應的外掛Mapstruct Support
-
Eclipse IDE
可以配置M2E外掛 -
Eclipse IDE
需要在pom.xml中指定<m2e.apt.activation>jdt_apt</m2e.apt.activation>
mapstruct-processor 註解處理器中的選項
一般配置在pom.xml中build編譯外掛中
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.0</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
<annotationProcessorPaths>
<path>
<groupId>org.mapstruct</groupId>
<artifactId>mapstruct-processor</artifactId>
<version>1.3.0.Final</version>
</path>
</annotationProcessorPaths>
<compilerArgs>
<compilerArg>
-Amapstruct.suppressGeneratorTimestamp=true
</compilerArg>
<compilerArg>
-Amapstruct.suppressGeneratorVersionInfoComment=true
</compilerArg>
</compilerArgs>
</configuration>
</plugin>
複製程式碼
選項 | 說明 | 預設值 |
---|---|---|
mapstruct. suppressGeneratorTimestamp | 如果設定為true,@Generated則抑制在生成的對映器類中的註釋中建立時間戳。 | false |
mapstruct. suppressGeneratorVersionInfoComment | 如果設定為true,則抑制在生成的對映器類comment中的@Generated註釋中建立屬性。註釋包含有關MapStruct版本以及用於註釋處理的編譯器的資訊。 | false |
mapstruct.defaultComponentModel | 元件模型的名稱(請參閱檢索對映器)基於應生成的對映器。 | default |
mapstruct.unmappedTargetPolicy | 如果未使用源值填充對映方法的目標物件的屬性,則應用預設報告策略。 | WARN |
檢索對映器
支援的值 | 說明 | 檢索例項 |
---|---|---|
default | 對映器不使用元件模型,通常通過檢索例項 | Mappers#getMapper(Class) |
cdi | 生成的對映器是一個應用程式範圍的CDI bean | @Inject |
spring | 生成的對映器是一個單例範圍的Spring bean | @Autowired |
jsr330 | 生成的對映器使用{@code @Named}進行註釋 | @Inject |
使用
基本對映
要建立對映器,只需使用所需的對映方法定義Java介面,並使用註釋對其進行
org.mapstruct.Mapper
註釋
@Mapper
public interface CardMapper {
CardMapper INSTANCE = Mappers.getMapper(CardMapper.class);
/**
* card 轉 CardDto .
*
* @param card
* @return
*/
@Mapping(target = "maker",source = "make")
CardDto dto(Card card);
/**
* CardDt 轉 card .
*
* @param cardDto
* @return
*/
@Mapping(target = "make",source = "maker")
Card entity(CardDto cardDto);
}
複製程式碼
該@Mapper註釋將使得MapStruct
程式碼生成器建立的執行CardMapper
過程中生成時的介面。
在生成的方法實現中,源型別(例如Card
)中的所有可讀屬性將被複制到目標型別中的相應屬性中(例如CardDto
)
- 當某個屬性與其目標實體對應的名稱相同時,它將被隱式對映。
- 當屬性在目標實體中具有不同的名稱時,可以通過
@Mapping
註釋指定其名稱。
轉換特徵
MapStruct
的一般原理是生成儘可能多的程式碼,就像你自己親自編寫程式碼一樣。特別地,這意味著通過普通的setter
/ setter
呼叫而不是反射或類似的方法將值從源複製到目標。
MapStruct
會考慮源和目標型別的所有公共屬性。這包括在超型別上宣告的屬性。
MapStruct
會進行某些隱式轉換。
public class CardMapperImpl implements CardMapper {
@Override
public CardDto dto(Card card) {
if ( card == null ) {
return null;
}
CardDto cardDto = new CardDto();
cardDto.setMaker( card.getMake() );
cardDto.setName( card.getName() );
cardDto.setNote( card.getNote() );
cardDto.setImage( card.getImage() );
cardDto.setCreateTime( card.getCreateTime() );
cardDto.setPrice( card.getPrice() );
return cardDto;
}
@Override
public Card entity(CardDto cardDto) {
if ( cardDto == null ) {
return null;
}
Card card = new Card();
card.setMake( cardDto.getMaker() );
card.setName( cardDto.getName() );
card.setNote( cardDto.getNote() );
card.setImage( cardDto.getImage() );
card.setCreateTime( cardDto.getCreateTime() );
card.setPrice( (int) cardDto.getPrice() );
return card;
}
}
複製程式碼
生成實現類位置如下: