将 List 转换为具有多个参数的另一个 List

Hai*_*uza 5 mapstruct

我有 2 个对象 ExpertJpa 到 ExpertDto 的现有映射,需要另一个参数来过滤 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);
Run Code Online (Sandbox Code Playgroud)

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

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

Sja*_*aak 4

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) );

   }
} 
Run Code Online (Sandbox Code Playgroud)

现在定义你的映射器:

@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)
Run Code Online (Sandbox Code Playgroud)

注意:MapStruct 现在将识别列表映射,因为 IdentityContext 被标记为 @Context(因此:它将仅在调用方法中设置,但本质上不是映射源-目标本身的一部分)。