Java 使用带有MapStruct的生成器将空值映射到默认值

Java 使用带有MapStruct的生成器将空值映射到默认值,java,protocol-buffers,mapstruct,protobuf-java,Java,Protocol Buffers,Mapstruct,Protobuf Java,我想将字段从Source映射到Target类,如果源值为null,我想根据数据类型将其转换为默认值(“字符串”表示字符串,0表示数字类型等)。对于设置值,我使用的不是常规的setter,而是builder(使用,因此方法的名称是newBuilder()和build()) 我的映射器如下所示: @Mapper( nullValuePropertyMappingStrategy = NullValuePropertyMappingStrategy.SET_TO_DEFAULT, nu

我想将字段从
Source
映射到
Target
类,如果源值为
null
,我想根据数据类型将其转换为默认值(“字符串”表示字符串,0表示数字类型等)。对于设置值,我使用的不是常规的setter,而是builder(使用,因此方法的名称是
newBuilder()
build()

我的映射器如下所示:

@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和构建器中的一个bug,还是我缺少一些配置,无法将空映射设置为默认策略,而不是在所有字段映射上重复它

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

@Mapping(source=“value”,target=“value”,nullValuePropertyMappingStrategy=nullValuePropertyMappingStrategy.SET_为默认值)

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

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

命名并不是真正的辉煌,它有着悠久的历史。我们仍然打算在某一天调整这一点

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

也许你可以这样做:

@Mapper(
    nullValuePropertyMappingStrategy = NullValuePropertyMappingStrategy.SET_TO_DEFAULT,
    nullValueMappingStrategy = NullValueMappingStrategy.RETURN_DEFAULT
)
public interface TargetMapper {
    Target map(Source source);
}
@Mapper(
//执行空检查
nullValueCheckStrategy=nullValueCheckStrategy.ALWAYS
)
公共接口目标映射器{
目标地图(源);
}
//创建预定义对象(默认设置为先验)。不确定
//这是否适用于建设者..试试看
@对象工厂
默认的Target.Builder create(){
Target.Builder=Target.newBuilder();
builder.setValueX(“someDefaultValue”);
返回生成器;
}

感谢您的解释,现在我已经明白了!ObjectFactory的解决方案对我来说非常冗长,因此我将坚持使用nullValueCheckStrategy,在这种情况下,这对我来说已经足够了,因为如果不调用setter,protobuf构建器总是设置默认值。