gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 00:05:44 26 4
gpt4 key购买 nike

在 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 的子方法。)

我是否误用了这个表达式,所以它只是巧合,还是新版本有错误?如果没有bug,我该如何通过 request正确地实例化表达式?

最佳答案

你/正在滥用这个表达。您需要做的是将目标映射到源参数。

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

关于MapStruct:如何将输入对象传递给表达式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46305208/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com