【问题标题】:MapStruct: How to pass input object to expression?MapStruct:如何将输入对象传递给表达式?
【发布时间】:2017-09-20 04:22:12
【问题描述】:

在 MapStruct 版本 1.1.0.Final 中,这是可能的......

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

这是可能的,因为mapDetails 方法(巧合?)生成到requestToResponse 方法中。这就是request 不为空的原因。

现在,由于 1.1.0.Final 不适用于 Lombok,我不得不升级到 1.2.0.CR2。在这个版本中,mapDetails 将被生成到一个单独的方法中,其中request 没有传递,所以request 现在在这个方法中为空,我得到一个带有表达式的 NPE。 (现在是requestToResponse的子子方法。)

是不是我误用了这个表达方式,它只是巧合,还是新版本有错误?如果没有错误,我该如何正确地将 request 实例传递给表达式?

【问题讨论】:

    标签: mapstruct


    【解决方案1】:

    您曾经/正在滥用该表达式。您需要做的是将目标映射到源参数。

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

    【讨论】:

    • 确保您对此进行了良好的测试,嵌套目标属性在 1.2.0 中得到了增强,并且可能存在无法正常工作的情况(之前也有问题)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-05-30
    • 1970-01-01
    • 2020-02-25
    • 1970-01-01
    • 1970-01-01
    • 2019-12-13
    • 2012-10-26
    相关资源
    最近更新 更多