Java オブジェクトのコピー MapStruct

導入

オブジェクトのコピー コードはコンパイル時に生成できます。わかりやすく、機能的な位置付けorg.springframework.beans.BeanUtils
公式ウェブサイトGitHub-MapStruct

入門

Maven プロジェクトには依存関係が導入されています。

  1. mapstruct: @Mapping などの必要なアノテーションが含まれています
  2. mapstruct-processor: アノテーション プロセッサ。アノテーションに基づいてマッパー実装を自動的に生成します。
<dependency>
    <groupId>org.mapstruct</groupId>
    <artifactId>mapstruct</artifactId>
</dependency>
<dependency>
    <groupId>org.mapstruct</groupId>
    <artifactId>mapstruct-processor</artifactId>
</dependency>

実際の戦闘:

import org.mapstruct.Mapper;
import org.mapstruct.Mapping;
import org.mapstruct.Mappings;
import org.mapstruct.factory.Mappers;

// 如果增加componentModel 增生成的实现类有注解@Component
@Mapper(componentModel = "spring")
public interface AccountConvert {
    
    

    AccountConvert INSTANCE = Mappers.getMapper(AccountConvert.class);

    @Mappings({
    
    
            @Mapping(target = "username", source = "userName")
            @Mapping(source = "userTypeEnum", target = "type")
			@Mapping(target = "createTime", expression = "java(com.java.mmzsblog.util.DateTransform.strToDate(source.getCreateTime()))"),

    })
    Account dto2Entity(AccountDTO dto);

	@Data
	private static class Account {
    
    
		private string username;
	}
	
	@Data   
  	private static class AccountDTO {
    
    
		private string userName;
	}

	@Getter
	@AllArgsConstructor
	public enum UserTypeEnum {
    
    
	    JAVA("000", "Java开发工程师"),
	    DB("001", "数据库管理员");	    
	    private String value;
	    private String title;
	}

クラスファイルを生成します。

@Generated(
    value = "org.mapstruct.ap.MappingProcessor",
    date = "2023-06-10T12:52:02+0800",
    comments = "version: 1.5.5.Final, compiler: javac, environment: Java 11.0.18 (Azul Systems, Inc.)"
)
public class AccountConvertImpl implements AccountConvert {
    
    
	@Override
    public Account dto2Entity(AccountDTO dto) {
    
    
        if (dto == null) {
    
    
            return null;
        }
        Account account = new Account();
        account.setUsername(dto.getUserName());
        return account;
    }
}

春の豆

@Mapper アノテーションを使用する場合、メモしておくとSpring Bean として使用componentModel = "spring"できます。AccountConvert

@Resource
private DrugConverter drugConverter;

ここに画像の説明を挿入

原理

フィールドの型が一致しない場合、MapStruct は型変換の型を自動的に実装できます。

  1. 基本型とそれに対応するラッパー型
  2. 基本型のラッパー型とString型の間

型変換に加えて、式を定義することによって変換を指定できます。

注釈

  • インターフェイス クラスに使用される @Mapper は、静的クラスまたは Spring Bean クラスを定義するものとして理解できます。
  • @Mapping、ソース エンティティ クラスとターゲット エンティティ クラス間のマッピング関係を指定します。
  • @Mappings、複数の @Mappings のコレクション
  • @MapMapping:
  • @BeanMapping:
  • @BeforeMapping & @AfterMapping: Junit の @BeforeTest と @AfterTest と同様に、@Mapping の前後に処理を実行します。
  • @InheritConfiguration:
  • @InheritInverseConfiguration: DTO から PO へのインターフェイス メソッド定義がすでに存在し、PO から DTO へのインターフェイスが必要な場合、このアノテーションを使用して、ソース、ターゲット、dateFormat などの情報の構成とメンテナンスを保存できます。

データ型マッピング

MapStruct は、ソース属性とターゲット属性の間のデータ型変換をサポートし、以下に適用できる自動型変換も提供します。

  • プリミティブ型とそれに対応するラッパー クラスの間
  • 任意の基本型と任意のラッパー クラス (byte や Integer など) の間
  • すべての基本型とラッパー クラスと文字列の間
  • 列挙型と文字列の間
  • Java の大きな数値型 ( java.math.BigIntegerjava.math.BigDecimal) と Java の基本型 (そのラッピング クラスを含む) および String の間。

日付変換の場合は、dateFormat フラグを使用して日付形式を指定でき、
デジタル変換の場合は、numberFormat フラグを使用して表示形式を指定できます。

列挙型マップ

戦闘

使用中に発生した問題を記録する

マッピング プロセッサの内部エラー: java.lang.NullPointerException

IDEA 2022.1.4 (Ultimate Edition) バージョンでは、デバッグ モードでのアプリケーションの起動が失敗します。

java: Internal error in the mapping processor: java.lang.NullPointerException
at org.mapstruct.ap.internal.processor.DefaultVersionInformation.createManifestUrl(DefaultVersionInformation.java:182)      at org.mapstruct.ap.internal.processor.DefaultVersionInformation.openManifest(DefaultVersionInformation.java:153)      at org.mapstruct.ap.internal.processor.DefaultVersionInformation.getLibraryName(DefaultVersionInformation.java:129)      at org.mapstruct.ap.internal.processor.DefaultVersionInformation.getCompiler(DefaultVersionInformation.java:122)
at org.mapstruct.ap.internal.processor.DefaultVersionInformation.fromProcessingEnvironment(DefaultVersionInformation.java:95)
at org.mapstruct.ap.internal.processor.DefaultModelElementProcessorContext.<init>(DefaultModelElementProcessorContext.java:54)
at org.mapstruct.ap.MappingProcessor.processMapperElements(MappingProcessor.java:264)
at org.mapstruct.ap.MappingProcessor.process(MappingProcessor.java:166)
at org.jetbrains.jps.javac.APIWrappers$ProcessorWrapper.process(APIWrappers.java:157)

リファレンス、解決策: MapStruct pom の依存関係をアップグレードします1.4.0.Final-> 現在の最新バージョン1.5.5.Final

ターゲット Bean プロパティが見つかりません: Collection 要素をマップできません。マッピング メソッドを宣言/実装することを検討してください。

アプリケーションがデバッグ モードで起動し、エラーが報告されます。

java: No target bean properties found: can't map Collection element "DrugEsEntity drugEsEntity" to "DrugListVo drugListVo". Consider to declare/implement a mapping method: "DrugListVo map(DrugEsEntity value)".

既存のインターフェース定義:

@Mapper
public interface DrugConverter {
    
    
    DrugConverter INSTANCE = Mappers.getMapper(DrugConverter.class);
    
    List<DrugListVo> esToVos(List<DrugEsEntity> entities);
}

解決策として、インターフェースを追加します。

DrugListVo esToVo(DrugEsEntity entity);

これは、生成されたコードDrugConverterImplで明らかです。
ここに画像の説明を挿入

参考

MapStruct 1.5 リリースは Map から Bean への変換をサポートします

おすすめ

転載: blog.csdn.net/lonelymanontheway/article/details/120401779