在 mapstruct 中有 @Mapping(target = "field", source = "") 是什么意思?

What does it mean in mapstruct to have @Mapping(target = "field", source = "")?

我刚刚用一些 mapstruct 映射器克隆了一个 repo (1.3.1.Final) 由于以下原因,构建失败:

java: No property named "" exists in source parameter(s). Did you mean "sourceField1"?

我将 mapstruct 更新到版本 1.4.2.Final,但结果相同。

查看代码,我发现我们有以下情况:

    @Mapper(componentModel = "spring")
    public interface TheMapper {

        @Mapping(target = "targetField1", source = "sourceField1")
        @Mapping(target = "targetField2", source = "sourceField2")
        @Mapping(target = "notInSourceField", source = "")
        TargetClass mapToTarget(SourceClass source);
    }

为了解决上述错误,我将 source = "" 行更改为:

@Mapping(target = "notInSourceField", expression = "java(\"\")") //means that notInSourceField = ""

但我假设 source = "" 意味着该值将为空。这个假设是否正确,或者它的实际含义是什么?

信息

为什么源的注释中的默认值为“”?

source 的默认值的原因是注释处理器知道用户定义的 "" 和默认值 "" 之间的区别。使用默认值它将使用 target 而不是 source 除非定义了 constantexpressionignore=true 之一。

@Mapping(target = "date", dateFormat = "dd-MM-yyyy")

在上面的示例中,source 属性 也被命名为 date,但是对于 sourcetarget 之间的转换需要额外的信息.在本例中为 dateFormat。在这种情况下,您不需要指定 source

来源

这是当源 class 中 属性 的名称与目标 class 中的不同时使用的名称。

@Mapping( target="targetProperty", source="sourceProperty" )

不变

当您想要应用常量值时使用。当字段应始终获得特定值时。

@Mapping( target="targetProperty", constant="always this value" )

表达式

这是在 mapstruct 的其他功能都无法解决您的问题时使用的方法。在这里您可以定义自己的代码来设置 属性 值。

@Mapping( target="targetProperty", expression="java(combineMultipleFields(source.getField1(), source.getField2()))" )

忽略

这是当您希望 mapstruct 忽略该字段时使用的内容。

@Mapping( target="targetProperty", ignore=true )

回答

根据以上信息,我们现在知道您告诉 MapStruct 您想要将 属性 notInSourceField 设置为 属性 。 MapStruct 没有找到名为 get() 的方法,因此它告诉您 属性 不存在。 您的解决方案是 使用 constant="" 而不是 source="".

You can find more information about default values and constants here.