Mapstruct: コレクションマッピングの特定のフィールドのみを無視する 質問する

Mapstruct: コレクションマッピングの特定のフィールドのみを無視する 質問する

エンティティをマップするために次のマッパーを使用しています:

public interface AssigmentFileMapper {

AssigmentFileDTO assigmentFileToAssigmentFileDTO(AssigmentFile assigmentFile);

AssigmentFile assigmentFileDTOToAssigmentFile(AssigmentFileDTO assigmentFileDTO);

@Mapping(target = "data", ignore = true)
List<AssigmentFileDTO> assigmentFilesToAssigmentFileDTOs(List<AssigmentFile> assigmentFiles);

List<AssigmentFile> assigmentFileDTOsToAssigmentFiles(List<AssigmentFileDTO> assigmentFileDTOs);
}

コレクションとしてマップされたエンティティに対してのみ、「データ」フィールドを無視する必要があります。ただし、単一のエンティティに対してのみ機能するようです。また、生成されたメソッドは for ループ内でのみ使用される@Mappingことに気付きました。これに対する解決策はありますか?assigmentFilesToAssigmentFileDTOsassigmentFileToAssigmentFileDTO

ベストアンサー1

MapStructは、コレクションマッピングに見つかった割り当てを使用します。目的を達成するには、フィールドをdata明示的に無視するカスタムメソッドを定義し、@IterableMapping(qualifiedBy)または@IterableMapping(qualifiedByName)必要な方法を選択します。

マッパーは次のようになります。

public interface AssigmentFileMapper {

    AssigmentFileDTO assigmentFileToAssigmentFileDTO(AssigmentFile assigmentFile);

    AssigmentFile assigmentFileDTOToAssigmentFile(AssigmentFileDTO assigmentFileDTO);

    @IterableMapping(qualifiedByName="mapWithoutData")
    List<AssigmentFileDTO> assigmentFilesToAssigmentFileDTOs(List<AssigmentFile> assigmentFiles);

    List<AssigmentFile> assigmentFileDTOsToAssigmentFiles(List<AssigmentFileDTO> assigmentFileDTOs);

    @Named("mapWithoutData")
    @Mapping(target = "data", ignore = true)
    AssignmentFileDto mapWithouData(AssignmentFile source)

}

使用すべきorg.mapstruct.Namedこうすることで、この動作は実現できます。また、javax.inject.Named次のようにして独自の注釈を定義することもできます。org.mapstruct.Qualifier

詳細情報はこちらのドキュメント

おすすめ記事