Вопрос:
Я использую следующий mapper для отображения сущностей:
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 просто использует assigmentFileToAssigmentFileDTO для for-loop. Есть ли для этого решение?
Лучший ответ:
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
Дополнительную информацию можно найти в документации.