在 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
,但结果相同。
查看代码,我发现我们有以下情况:
SourceClass
字段 sourceField1
、sourceField2
、sourceField3
TargetClass
字段为 targetField1
、targetField2
、notInSourceField
@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
除非定义了 constant
、expression
或 ignore=true
之一。
@Mapping(target = "date", dateFormat = "dd-MM-yyyy")
在上面的示例中,source
属性 也被命名为 date
,但是对于 source
和 target
之间的转换需要额外的信息.在本例中为 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.
我刚刚用一些 mapstruct 映射器克隆了一个 repo (1.3.1.Final
)
由于以下原因,构建失败:
java: No property named "" exists in source parameter(s). Did you mean "sourceField1"?
我将 mapstruct 更新到版本 1.4.2.Final
,但结果相同。
查看代码,我发现我们有以下情况:
SourceClass
字段sourceField1
、sourceField2
、sourceField3
TargetClass
字段为targetField1
、targetField2
、notInSourceField
@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
除非定义了 constant
、expression
或 ignore=true
之一。
@Mapping(target = "date", dateFormat = "dd-MM-yyyy")
在上面的示例中,source
属性 也被命名为 date
,但是对于 source
和 target
之间的转换需要额外的信息.在本例中为 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.