MapStruct
是一個用於生成類型安全,高性能和無依賴的bean映射代碼的註釋處理器。競爭對手是Selma
。html
MapStruct是一個Java 註釋處理器,用於生成類型安全的bean映射類。java
您所要作的就是定義一個mapper接口,該接口聲明任何所需的映射方法。在編譯期間,MapStruct將生成此接口的實現。此實現使用普通的Java方法調用來在源對象和目標對象之間進行映射,即沒有反射或相似。git
與手工編寫映射代碼相比,MapStruct經過生成繁瑣且易於編寫的代碼來節省時間。遵循約定優於配置方法,MapStruct使用合理的默認值,但在配置或實現特殊行爲時會採起措施。spring
與動態映射框架相比,MapStruct具備如下優點:apache
經過使用普通方法調用而不是反射來快速執行安全
編譯時類型安全:只能映射相互映射的對象和屬性,不會將訂單實體意外映射到客戶DTO等。app
在構建時清除錯誤報告,若是框架
映射不完整(並不是全部目標屬性都已映射)eclipse
映射不正確(找不到合適的映射方法或類型轉換)maven
包含所需的註釋,例如@Mapping
<dependency>
<groupId>org.mapstruct</groupId>
<artifactId>mapstruct</artifactId>
<version>1.3.0.Final</version>
</dependency>
複製代碼
在編譯,生成映射器實現的註釋處理器,配置在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>
通常配置在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;
}
}
複製代碼
生成實現類位置以下: