Преобразовать список в другой список с несколькими параметрами - PullRequest
0 голосов
/ 07 января 2019

У меня есть существующее сопоставление 2 объектов ExpertJpa и ExpertD, которым нужен другой параметр для фильтрации ExpertJpa. Эта карта работает нормально, и теперь я пытаюсь преобразовать Список ExpertJpa в Список ExpertDto, я добавляю этот второй параметр.

@Mappings({
        @Mapping(target = "status", ignore = true),
        @Mapping(target = "profile", source = "input.expertProfile"),
        @Mapping(target = "engagementId", expression = "java(new MapperHelper().ReturnExpertEngagementIdByApiKey(input,identity))"),
        @Mapping(target = "campaignId", expression = "java(new MapperHelper().ReturnExpertCampaignIdByApiKey(input,identity))"),

})
Expert ExpertJpaToExpert(com.consumer.expert.dbaccessor.entities.Expert input, Identity identity);

List<Expert> ListExpertsJpaToListExperts(List<com.consumer.expert.dbaccessor.entities.Expert> input, Identity identity);

При сборке я получаю сообщение об ошибке, что List является интерфейсом и не может быть экземпляром ....

Ошибка: (53, 18) java: тип возвращаемого значения java.util.List - абстрактный класс или интерфейс. Укажите неабстрактный / неинтерфейсный тип результата или фабричный метод.

1 Ответ

0 голосов
/ 12 января 2019

MapStruct может сделать это автоматически для вас. Однако он не может обрабатывать методы с несколькими аргументами (в принципе он сопоставляет источник с целью).

Сказав это, если немного переписать свой код, вы можете избавиться от выражения и получить полное типовое безопасное решение.

Итак:

class IdentityContext {

   private final Identity id;
   private final MapperHelper mapperHelper; 

   public IdentityContext(Identity id){
       this.id = id;
       this.mapperHelper = new MapperHelper();
   }

   @AfterMapping
   public void setIds(com.consumer.expert.dbaccessor.entities.Expert input, @MappingTarget Expert expertOut) {
      expertOut.setEngagementId( mapperHelper.ReturnExpertEngagementIdByApiKey(input,identity) );
      expertOut.setCampaignId( mapperHelper. ReturnExpertCampaignIdByApiKey(input,identity) );

   }
} 

теперь определите ваш маппер так:

@Mappings({
        @Mapping(target = "status", ignore = true),
        @Mapping(target = "profile", source = "input.expertProfile")        
})
Expert ExpertJpaToExpert(com.consumer.expert.dbaccessor.entities.Expert input, @Context IdentityContext ctx);

List<Expert> ListExpertsJpaToListExperts(List<com.consumer.expert.dbaccessor.entities.Expert> input, @Context IdentityContext ctx)

Примечание: MapStruct теперь распознает отображение списка, потому что IdentityContext помечен как @Context (поэтому: он будет установлен только в вызывающем методе, но по сути не будет частью самой цели-источника отображения).

...