当前位置: 首页 > 知识库问答 >
问题:

使用带有MapStruct的builder将空值映射为默认值

柳梓
2023-03-14

我想将字段从映射到目标类,如果源值为,我想将其转换为基于数据类型的默认值(“”表示字符串,0表示数值类型等)。对于设置值,我不使用常规的setter,而是使用builder(带有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检查并在source返回null时设置默认值。有趣的是,当我向map方法添加以下注释时,在实现中出现了空检查。

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

这是构建器中的MapStruct中的一个bug吗?还是我缺少了一些配置来将空映射设置为默认策略,而不是在所有字段映射上重复它?

编辑:由于某种原因,将NullValueCheckStrategy=NullValueCheckStrategy.Always添加到类级别的@mapper批注会添加空检查,但不会显式设置值,只是跳过对SetValue的调用。对于protobuf来说,这是可以的,因为该功能在库中,但是对于其他实现,该字段将保持为空。

共有1个答案

慎懿轩
2023-03-14

@mapping(Source=“value”,target=“value”,nullValuePropertyMappingStrategy=nullValuePropertyMappingStrategy.set_to_default)

应用于update方法(因此具有@mappingtarget注释参数的方法

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

@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;

}
 类似资料:
  • 后续问题。有这样的等级制度。其中A是基类: 以及以下内容: 我想将B实例的所有ID映射到B.isVisible()的值,并将C实例的ID映射到TRUE 在最初问题的帮助下,我将其提炼为以下格式: 丑陋的版本是: 有没有帮助改进它,为更优雅的版本提供默认true?

  • 问题内容: 我正在尝试使用Jackson将一些JSON对象映射到Java对象。JSON对象中的某些字段是必填字段(可以用标记),而某些字段是可选字段。 用Jackson映射之后,在JSON对象中未设置的所有字段在Java中都将具有空值。是否有类似的注释可以告诉Jackson为Java类成员设置默认值(如果为null)? 编辑:为了使问题更清楚,这里是一些代码示例。 Java对象: JSON对象可以

  • 我正在尝试用Jackson将一些JSON对象映射到Java对象。JSON对象中的一些字段是强制性的(我可以用标记),而一些字段是可选的。 在与Jackson进行映射之后,JSON对象中没有设置的所有字段在Java中都将有一个空值。是否有类似于的注释可以告诉Jackson为Java类成员设置默认值,以防它为空? 或: 注释只是为了显示我的要求。这不是真正的注解。如果JSON对象与第一个示例类似,我希

  • 我有简单的对象客户端

  • 我正在使用龙目岛的建设者。将默认值分配给我试图使用的一些变量 @建筑商。违约 但问题是,在使用上述注释时,我不再能够通过生成器初始化该值,因为编译器在尝试通过生成器初始化变量时说无法解析方法。 所以,本质上我要寻找的是一种设置默认值的方法,并且在通过构建器启动时仍然能够覆盖。

  • 我有一个映射定义为 其中定义如下: 反向映射是使用处理的。如何为反向映射指定自定义映射?