MapStruct 映射对象所有属性的默认值的最简单方法

问题描述 投票:0回答:1

假设我有一个目标对象

MyObject {
    boolean myBoolean;
    int myInt;
    ...
}

其中字段 myBoolean 和 myInt 是必需的(即,如果您尝试在 MyObject 的 Builder 上调用 build() 而不设置这些字段,则会引发错误)。

尽管尝试了许多似乎与此功能相关的 MapStruct 构造,但我似乎找不到一种简单的方法来告诉 MapStruct 为对象中的每个字段设置默认值,以确保已设置所有必需字段:

  1. 根据文档,NullValuePropertyMappingStrategy 仅适用于更新方法。
  2. 如果我尝试在 @Mapper 级别设置 nullValueMappingStrategy = NullValueMappingStrategy.RETURN_DEFAULT,MapStruct 实际上不会为每个字段设置默认值。生成的代码看起来像(例如):

.

Builder target = new Target.builder();
if (source != null) {
    if ( source.isMyBoolean() != null ) {
        target.withMyBoolean( source.isMyBoolean() );
    }
    ...
}
target.build();

在上面,Source 中的 myBoolean 字段是一个布尔值(相对于布尔值)。如您所见,如果 source.isMyBoolean == null 则不会调用 target.withMyBoolean(...) ,从而导致错误。

我发现解决此问题的唯一方法是在每个必需属性的单个 @Mapping 级别上指定 NullValueMappingStrategy 或 defaultValue,这是非常冗长的。

想知道是否有人知道更好的方法来实现这一点。

null mapstruct
1个回答
0
投票

如果您的目标对象具有基元,则您的字段具有默认值,不是吗?

正如文档 NullValueMappingStrategy.RETURN_DEFAULT 中所说,适用于 bean、list ...,但你是对的,不适用于 Integer、String、Boolean。

如果我有:

public class MyObjectDTO {

  Boolean myBoolean;

  Integer myInt;

  String myString;

  TempObjectDTO tempObjectDTO;
}

public class MyObject {

  Boolean myBoolean;

  Integer myInt;

  String myString;

  TempObject tempObject;
}

映射 MyObject 后 <--> MyObjectDTO :

  • TempObject/TempObjectDTO 有默认值
  • 所有其他对象都有空值。

为了防止这种情况,我在映射器中为 String、Integer、Boolean 创建了映射方法,并使用工厂,因为 Integer 和 Boolean 没有默认构造函数。

映射器

@Mapper(nullValueMappingStrategy = NullValueMappingStrategy.RETURN_DEFAULT,//
    uses = { DefaultFactory.class })
public interface MyObjectMapper {

  @Mapping(source = "tempObjectDTO", target = "tempObject")
  MyObject fromDTO(MyObjectDTO myObjectDTO);

  @Mapping(source = "tempObject", target = "tempObjectDTO")
  MyObjectDTO toDTO(MyObject myObject);

  TempObject fromDTO(TempObjectDTO dto);

  TempObjectDTO fromDTO(TempObject tempObject);

  String from(String string);

  Integer from(Integer integer);

  Boolean from(Boolean booleanObject);
}

工厂

public class DefaultFactory {

  public Integer createInteger() {
    return new Integer(100);
  }

  public Boolean createBoolean() {
    return new Boolean(true);
  }
}
© www.soinside.com 2019 - 2024. All rights reserved.