2017-09-27 127 views
0

我需要一個映射,以實現這一目標:MapStruct:如何將所有屬性映射到列表的第一個元素?

@Mapping(source = "a", target = "result.transaction[0].a"), 
@Mapping(source = "b", target = "result.transaction[0].b"), 
@Mapping(source = "c", target = "result.transaction[0].c"), 
... 
Response dataToResponse(DataModel model); 

但是這句法不工作(順便說一句:這工作與Spring bean封裝)。 像this一個解決方案僅僅是一個夾生的解決方案:

@AsList 
public <T> List<T> asList(T in) { 
    List<T> result = new ArrayList<T>(); 
    if (in!=null) { 
     result.add(in); 
    } 
    return result; 
} 

這隻適用於只有一個屬性,因爲它總是會爲每個屬性的新名單。我不需要將每個屬性映射到新列表的第一個元素。該列表必須重用,但我不知道這是如何工作的。什麼是實現這一目標的正確途徑? 我想過這樣的事情:

@Mapping(source = "a", target = "transaction.a"), 
@Mapping(source = "b", target = "transaction.b"), 
@Mapping(source = "c", target = "transaction.c"), 
... 
Transaction dataToTransaction(DataModel model); 

然後......

@Mapping([use Transaction from b4], target = "result"); 

但我怎麼能傳遞已經映射字段從上面? (我正在使用最新的最終版本1.1.0.Final)

回答

0

顯然沒有乾淨的解決方案。於是,我只好解決方法是通過排除以下映射到一個單獨的映射:

@Mapping(source = "a", target = "transaction.a"), 
@Mapping(source = "b", target = "transaction.b"), 
@Mapping(source = "c", target = "transaction.c"), 
Transaction dataToTransaction(DataModel model); 

在主映射器,我單獨執行映射器,它通過表達式轉換成一個列表:

@Mapping(expression = "java(Arrays.asList(SubMapper.INSTANCE.dataToTransaction(model)))", target = "result.transactions") 
相關問題