代码之家  ›  专栏  ›  技术社区  ›  Bevor

MapStruct:如何将输入对象传递给表达式?

  •  4
  • Bevor  · 技术社区  · 7 年前

    在MapStruct版本1.1.0中。最后,这是可能的。。。。

    @Mappings({
        @Mapping(target = "transaction.process.details", expression = "java(MappingHelper.mapDetails(request))"),
         //more mappings
    })
    Response requestToResponse(Request request);
    

    mapDetails requestToResponse 方法这就是为什么 request

    现在,从1.1.0开始。期末考试不适用于龙目,我必须升级到1.2.0。CR2 地图详细信息 将生成一个单独的方法,其中 要求 没有通过,所以 要求 现在在这个方法中为null,我得到一个带有表达式的NPE。(这是一种 请求响应 现在。)

    要求

    1 回复  |  直到 7 年前
        1
  •  16
  •   Filip    7 年前

    你过去/现在误用了这个短语。您需要做的是将目标映射到源参数。

    @Mapper(uses = { MappingHelper.class })
    public interface MyMapper {
    
        @Mappings({
            @Mapping(target = "transaction.process.details", source = "request"),
             //more mappings
        })
        Response requestToResponse(Request request);
    }
    

    然后,MapStruct应该创建中介方法并使用 MappingHelper 并调用 mapDetails 方法如果有多个方法从 Request 到任何类型 details here 在文档中)。

    它看起来像:

    public class MappingHelper {
        @Named("mapDetails") // or the better type safe one with the meta annotation @Qualifier
        public static String mapDetails(Request request);
    }
    

    您的映射将如下所示:

    @Mapper(uses = { MappingHelper.class })
    public interface MyMapper {
    
        @Mappings({
            @Mapping(target = "transaction.process.details", source = "request", qualifiedByName = "mapDetails"), //or better with the meta annotation @Qualifier qualifiedBy
             //more mappings
        })
        Response requestToResponse(Request request);
    }