【发布时间】:2021-02-12 20:57:25
【问题描述】:
我开始使用 MapStruct。我无法理解我们何时在 MapStruct 中使用“表达式”标签?为什么我们有某些使用“目标”标签和“表达式”标签的映射?这是否意味着当您想要将 bean 中的两个或多个字段映射到目标中的单个属性/字段时使用表达式,如文档“http://mapstruct.org/documentation/stable/reference/html/#expressions”中所述
【问题讨论】:
我开始使用 MapStruct。我无法理解我们何时在 MapStruct 中使用“表达式”标签?为什么我们有某些使用“目标”标签和“表达式”标签的映射?这是否意味着当您想要将 bean 中的两个或多个字段映射到目标中的单个属性/字段时使用表达式,如文档“http://mapstruct.org/documentation/stable/reference/html/#expressions”中所述
【问题讨论】:
当您无法将源映射到目标属性或 constant 不适用时,使用表达式。 MapStruct 设想可以使用多种语言来处理表达式。但是,只实现了纯 java(因此 "java(... )" )。 EL 已被设想但尚未实现。
我使用的一个典型用例是生成 UUID。但即使在那里,您也可以尝试新的@Context 来实现该目标。
请记住,括号内的内容直接放在生成的代码中。 IDE 无法检查其正确性,您只会在编译过程中发现问题。
表达式是恕我直言,是 MapStruct 中尚未实现的内容的后备手段/填空者。
注意:通过其他答案中建议的自定义方法将目标映射到源可以自动完成。 MapStruct 将识别签名(返回类型、源类型)并调用您的自定义方法。您可以在同一界面(默认方法)或使用的映射器中执行此操作。
【讨论】:
一般来说,当您无法编写 MapStruct 映射器时,会使用 MapStruct 表达式。当库不适用于您的用例时,它们应该用作备用方法。
例如——正如文档所说——当映射需要多个源变量时,可以使用表达式将它们“注入”到映射器方法中。
另一个用例是当您需要使用的源变量——比如bar——不是源类的一部分,而是它的一个变量(这里是classVar)的成员。您可以使用带有@Mapping(target="foo", expression="java(myCustomMethod(source.classVar.bar)))" 的自定义myCustomMethod 方法将其映射到目标字段foo。
【讨论】: