web-dev-qa-db-ja.com

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);
}

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

8
Dmitry Kach

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 を使用して、独自の注釈を定義することもできます

あなたはより多くの情報を見つけることができます ここでドキュメント

16
Filip