2017-03-14 124 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

它的工作原理!谢谢。 –