1. 程式人生 > 程式設計 >Spring Boot MapStruct 快速拷貝方案選擇

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 IDEAEclipse 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;
    }
}
複製程式碼

生成實現類位置如下:

位置
螢幕截圖.png