我刚刚用一些mapstruct映射器克隆了一个repo(1.3.1.Final
(由于以下原因,生成失败:
java: No property named "" exists in source parameter(s). Did you mean "sourceField1"?
我将mapstruct更新到1.4.2.Final
版本,但结果相同。
回顾代码,我看到我们有以下情况:
- 具有字段
sourceField1
、sourceField2
、sourceField3
的SourceClass
- 具有字段
targetField1
、targetField2
、notInSourceField
的TargetClass
@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
。
来源
当源类中的属性名称与目标类中的名称不同时,将使用此方法。
@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()
的方法,因此它"告诉"您属性不存在。在您的情况下,解决方案将是Yan在评论中提到的使用
constant=""
而不是source=""
。
您可以在此处找到有关默认值和常量的更多信息。