我有 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 是抽象类或接口。提供非抽象/非接口结果类型或工厂方法。
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(因此:它将仅在调用方法中设置,但本质上不是映射源-目标本身的一部分)。
| 归档时间: |
|
| 查看次数: |
9161 次 |
| 最近记录: |