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



假设我有一个目标对象

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

其中字段 myBoolean 和 myInt 是必需的(即,如果您尝试在 MyObject 的生成器上调用 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();

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

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

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

如果目标对象具有基元,则字段具有默认值,否?

正如文档中所说NullValueMappingStrategy.RETURN_DEFAULT在豆子上工作,列出...但你对的不是整数、字符串、布尔值。

如果我有:

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 具有默认值
  • 所有其他对象都具有空值。

为了防止这种情况,我在映射器中为字符串、整数、布尔值创建了映射方法并使用工厂,因为整数和布尔值没有默认构造函数。

映射器

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

相关内容

  • 没有找到相关文章

最新更新