2

我想将字段从类映射SourceTarget类,如果源值为null,我想根据数据类型将其转换为默认值(字符串为“”,数字类型为 0 等)。对于设置值,我没有使用常规设置器,而是使用构建器(使用protobuf,因此方法的名称是newBuilder()and build())。

class Source {
    private final String value; // getter
}

class Target {
    private final String value;

    public static Builder newBuilder() {return new Builder()}

    public static class Builder {
        public static setValue() {/*Set the field*/}
        public static Target build() {/*Return the constructed instance*/}
}

我的映射器看起来像这样:

@Mapper(
    nullValuePropertyMappingStrategy = NullValuePropertyMappingStrategy.SET_TO_DEFAULT,
    nullValueMappingStrategy = NullValueMappingStrategy.RETURN_DEFAULT
)
public interface TargetMapper {
    Target map(Source source);
}

使用此代码调用生成的映射器实现target.setValue(source.getValue()),而不是执行 null 检查并在 source 返回时设置默认值null。有趣的部分是当我向方法添加以下注释时map,实现中存在空检查。

@Mapping(source="value", target="value", nullValuePropertyMappingStrategy = NullValuePropertyMappingStrategy.SET_TO_DEFAULT)

这是 MapStruct 中带有构建器的错误,还是我缺少一些配置才能将空映射设置为默认策略,而不是在所有字段映射上复制它?

编辑:由于某种原因,添加nullValueCheckStrategy = NullValueCheckStrategy.ALWAYS到类级别@Mapper注释会添加空检查,但不会显式设置值,只是跳过对setValue. 对于 protobuf,这没关系,因为此功能在库中,但对于其他实现,该字段将保持为空。

4

1 回答 1

1

@Mapping(source="value", target="value", nullValuePropertyMappingStrategy = NullValuePropertyMappingStrategy.SET_TO_DEFAULT)

适用于更新方法(因此具有@MappingTarget注释参数的方法

常规方法没有真正的对应物: 1.NullValueMappingStragegy适用于 bean 参数本身。2.NullValueCheckStragegy对 bean 属性进行检查,但不返回默认值。

命名并不是很出色,它有悠久的历史。我们仍然打算在某一天调整这一点。

一种解决方案是使用对象工厂创建构建器目标对象并使用默认值预填充它,然后让 MapStuct 有一天覆盖这些值。

也许你可以做这样的事情:

@Mapper(
    // to perform a null check
    nullValueCheckStrategy = NullValueCheckStrategy.ALWAYS
)
public interface TargetMapper {
    Target map(Source source);
}

// to create a pre-defined object (defaults set a-priori). Not sure
// whether this works with builders.. just try
@ObjectFactory
default Target.Builder create() {

   Target.Builder builder = Target.newBuilder();
   builder.setValueX( "someDefaultValue" );
   return builder;

}
于 2020-04-05T18:31:56.787 回答