簡體   English   中英

MapStruct:如何在映射到新的 Object 時實現 NullValuePropertyMappingStrategy.SET_TO_DEFAULT

[英]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#defaultValueMapping#defaultValueExpression

我們目前不支持執行類似於nullValuePropertyMappingStrategy的操作。

另一種方法是使用自定義@ObjectFactory ,它將在 object 中設置默認值。

也有人認為應該在 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 字段的defaultExpressiondefaultExpression = "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();
    }

這將產生我們想要的條件效果,這里是字符串:

  • map 僅非空)源屬性並忽略空/空源屬性
  • 所有目標屬性將在初始化期間設置為默認值

忽略策略

與映射中的默認值密切相關的是忽略策略。 但是它們似乎不適用於創建映射,而僅適用於更新(從當前版本 1.5.0.Beta2 開始)。

忽略null屬性(當前僅更新

請參閱MapStruct 參考指南10.6。 控制“null” arguments 的映射結果

任何注釋參數nullValuePropertyMappingStrategyNullValuePropertyMappingStrategy.IGNORENullValuePropertyMappingStrategy.SET_TO_DEFAULT )對創建映射沒有影響。

忽略未映射的屬性(並將預設默認值保留在目標位置)

還有一些策略可以完全忽略未映射的屬性 請參閱 Baeldung 的教程: 使用 MapStruct 忽略未映射的屬性

然而,這會將我們的默認值變成類似於final字段的東西,類似於常量。 默認值應設計為在給出更具體的值時被覆蓋。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM