【发布时间】:2020-07-08 03:00:24
【问题描述】:
我想将字段从Source映射到Target类,如果源值为null,我想根据数据类型将其转换为默认值(“”表示字符串,0表示数字类型等)。对于设置值,我不是使用常规设置器,而是生成器(使用protobuf,因此方法的名称是newBuilder() 和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 时设置默认值。有趣的是,当我在map 方法中添加以下注释时,实现中存在空值检查。
@Mapping(source="value", target="value", nullValuePropertyMappingStrategy = NullValuePropertyMappingStrategy.SET_TO_DEFAULT)
这是 MapStruct 中带有构建器的错误,还是我缺少一些配置以便能够将空映射设置为默认策略,而不是在所有字段映射上复制它?
编辑:出于某种原因,将nullValueCheckStrategy = NullValueCheckStrategy.ALWAYS 添加到类级别@Mapper 注释会添加空检查,但不会显式设置值,只是跳过对setValue 的调用。对于 protobuf,这没关系,因为此功能在库中,但对于其他实现,该字段将保持为空。
【问题讨论】:
标签: java protocol-buffers mapstruct protobuf-java