2017-03-14 167 views
3

我使用以下映射來映射實體忽略特定的字段: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。有沒有解決方案?

回答

5

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

定義自己的註釋您可以使用來定義自己的註釋。

+0

它的工作原理!謝謝。 –