【发布时间】:2019-04-01 19:12:13
【问题描述】:
假设我有一个目标对象
MyObject {
boolean myBoolean;
int myInt;
...
}
其中字段 myBoolean 和 myInt 是必需的(即,如果您尝试在未设置这些字段的情况下在 Builder 上为 MyObject 调用 build(),则会引发错误)。
我似乎找不到一种简单的方法来告诉 MapStruct 为我的对象中的每个字段设置默认值,以确保已设置所有必需的字段,尽管尝试了许多似乎与此功能相关的 MapStruct 构造:
- 根据文档,NullValuePropertyMappingStrategy 仅适用于更新方法。
- 如果我尝试在@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。
想知道是否有人知道更好的方法来实现这一点。
【问题讨论】:
-
您要找的不是default values 或default expressions 选项吗?
-
不,b/c 要求我为每个单独的映射设置这些。我想找到一种方法来告诉 MapStruct 在 Mapper 级别上设置默认值。就像我上面提到的,在 Mapper 上使用 nullValueMappingStrategy 不会导致设置所有属性。
-
您找到解决方案了吗?我也有同样的问题。