使用多个参数将列表转换为另一个列表

时间:2019-01-07 12:18:50

标签: mapstruct

我有2个对象ExpertJpa到ExpertDto的现有映射,需要另一个参数来过滤ExpertJpa。 该地图正常运行,现在我尝试将ExpertJpa列表转换为ExpertDto列表,然后添加第二个参数。

main()

在构建时,我收到错误消息,指出List是一个接口,不能是实例。...

错误:(53,18)java:返回类型java.util.List是一个抽象类或接口。提供非抽象/非接口结果类型或工厂方法。

1 个答案:

答案 0 :(得分:0)

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(因此:它将仅在调用方法中设置,而本质上不属于映射源目标本身)。