[英]MapStruct: How to achieve NullValuePropertyMappingStrategy.SET_TO_DEFAULT while mapping to a new Object
如果源中的相應屬性是 null,我想將目標 object 中的 map 屬性設置為默認值(例如字符串為“”)。 我怎樣才能做到這一點? 我看到
nullValuePropertyMappingStrategy = NullValuePropertyMappingStrategy.SET_TO_DEFAULT
僅在更新的情況下有效。
在創建目標 object 時是否可以實現某些目標?
在以下示例中, name
屬性映射到默認字符串"Sample"
:
@Mapper
public interface CarMapper {
@Mapping(source = "name", target = "name", defaultValue = "Sample")
Car getModelFromEntity(CarEntity carEntity);
}
您可以使用@Mapping
注解上的參數defaultValue
將 map 的任何null
值屬性從源到目標上的指定默認值。
如果要設置默認值,則需要使用Mapping#defaultValue
或Mapping#defaultValueExpression
。
我們目前不支持執行類似於nullValuePropertyMappingStrategy
的操作。
另一種方法是使用自定義@ObjectFactory
,它將在 object 中設置默認值。
也有人認為應該在 object 結構中設置默認值。
為了確保初始化時對象的默認值,我們可以在構造函數或字段聲明中定義它們。
例子:
class CarEntity {
String type = "SUV"; // default set at declaration
String color; // default set in constructor
String name; // no default, may be null!
public CarEntity() {
this.color = "black"; // default color set in constructor
}
}
在這里,我們為兩個字段預設了默認值。
如果已經在 class 中設置了默認值,則可以簡化映射。
null
值覆蓋目標中的預設默認值MapStruct可能支持這一點:
@Mapper
public interface CarMapper {
@Mapping(target = "type", ignore = true)
@Mapping(target = "name", source = "name", defaultValue = "Sample")
@Mapping(target = "color", condition = "isNotEmpty")
CarEntity dtoToCarEntity(CarDTO car);
@Condition
default boolean isNotEmpty(String value) {
return value != null && !value.isEmpty();
}
}
這個怎么運作:
type
在映射中被完全忽略。 它根本不會被映射。 所以目標的默認值被保留,而不是通過映射修改。null
,則name
字段設置為默認"Sample"
。 默認值也可以是空字符串,如defaultValue = ""
或類似 ID 字段的defaultExpression
: defaultExpression = "java( UUID.randomUUID().toString() )
。color
在源中作為null
或空字符串存在,它將被引用@Conditional
謂詞方法的指定condition = "isNotEmpty"
忽略。 請參閱 MapStruct 功能issue-205 。但是在10.10 中。 條件映射解釋說,我們可以用一個條件來決定屬性映射:
自定義條件方法是使用
org.mapstruct.Condition
注釋並返回 boolean 的方法。例如,如果您只想 map 一個字符串屬性,當它不是“空”並且它不為空時,您可以執行以下操作:
@Condition
default boolean isNotEmpty(String value) {
return value != null && !value.isEmpty();
}
這將產生我們想要的條件效果,這里是字符串:
與映射中的默認值密切相關的是忽略策略。 但是它們似乎不適用於創建映射,而僅適用於更新(從當前版本 1.5.0.Beta2 開始)。
null
屬性(當前僅更新)請參閱MapStruct 參考指南, 10.6。 控制“null” arguments 的映射結果。
任何注釋參數nullValuePropertyMappingStrategy
如NullValuePropertyMappingStrategy.IGNORE
或NullValuePropertyMappingStrategy.SET_TO_DEFAULT
)對創建映射沒有影響。
還有一些策略可以完全忽略未映射的屬性。 請參閱 Baeldung 的教程: 使用 MapStruct 忽略未映射的屬性。
然而,這會將我們的默認值變成類似於final
字段的東西,類似於常量。 默認值應設計為在給出更具體的值時被覆蓋。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.