mapStruct何时使用表达式?

时间:2019-06-19 20:45:29

标签: java mapstruct

我正在开始使用MapStruct。我不明白我们何时在MapStruct中使用“表达式”标签?为什么在使用“目标”标签和“表达式”标签的地方有某些映射?这是否意味着当您要将bean中的两个或更多字段映射到目标中的单个属性/字段时,就使用了表达式,如文档“ http://mapstruct.org/documentation/stable/reference/html/#expressions”中所述

2 个答案:

答案 0 :(得分:1)

在无法将源映射到目标属性或不应用constant时使用表达式。 MapStruct设想可以使用几种语言来处理表达式。但是,仅实现了纯Java语言(因此"java(... )")。 EL是可预见的,但尚未实现。

我使用的一个典型用例是生成一个UUID。但是即使在那儿,您也可以尝试使用新的@Context来实现该目标。

请记住,括号内的内容直接放在生成的代码中。 IDE无法检查其正确性,您只会在编译期间发现问题。

表达式是恕我直言,它是MapStruct中尚未实现的东西的后备手段/空白填充。


注意:如其他答案中所述,通过自定义方法将目标映射到源可以自动完成。 MapStruct将识别签名(返回类型,源类型)并调用您的自定义方法。您可以在相同的界面(默认方法)或使用的映射器中执行此操作。

答案 1 :(得分:0)

通常,当您简单无法编写MapStruct映射器时,将使用MapStruct表达式。当库不适用于您的用例时,应将它们用作备用方法。

例如,如文档所述,当映射需要多个源变量时,可以使用表达式“注入”然后映射到映射器方法。

另一个用例是,当您需要使用的源变量(例如bar)不是源类的一部分,而是其中一个变量的成员(此处为classVar)时, 。您可以使用带有foo的自定义myCustomMethod方法将其映射到目标字段@Mapping(target="foo", expression="java(myCustomMethod(source.classVar.bar)))"