在mapstruct中具有@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版本,但结果相同。

回顾代码,我看到我们有以下情况:

  • 具有字段sourceField1sourceField2sourceField3SourceClass
  • 具有字段targetField1targetField2notInSourceFieldTargetClass
@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

来源

当源类中的属性名称与目标类中的名称不同时,将使用此方法。

@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=""

您可以在此处找到有关默认值和常量的更多信息。

相关内容

  • 没有找到相关文章

最新更新