2016-11-10 25 views
1
public class SimpleDTO{ 
    private String firstElement; 
    private String lastElement; 
} 

public class ComplexSource{ 
    private List<String> elementList; 
} 

我試着用map().setFirstElement(source.getElementList().get(0))映射,將確保方法映射,但我得到一個錯誤,指出「1)源無效方法java.util.List.get()。具有零參數並且不返回無效。「Modelmapper:元件列表中POJO到現場

如何使用ModelMapper或其他替代方法將列表中的元素映射到Pojo中的字段?

回答

1

在這種情況下,您不能使用PropertyMap。如果您想使用ModelMapper進行映射,則必須像您所做的那樣使用Converter而不是PropertyMap

首先你的轉換器將在明年在sourceComplexSourceSimpleDTO是目標:

Converter<ComplexSource, SimpleDTO> converter = new AbstractConverter<ComplexSource, SimpleDTO>() { 
    @Override 
    protected SimpleDTO convert(ComplexSource source) { 
     SimpleDTO destination = new SimpleDTO(); 
     List<String> sourceList = source.getElementList(); 

     if(null != sourceList && !sourceList.isEmpty()){ 
      int sizeList = sourceList.size(); 

      destination.setFirstElement(sourceList.get(0)); 
      destination.setLastElement(sourceList.get(sizeList - 1)); 
     } 

     return destination; 
    } 
}; 

然後你只需要到轉換器添加到您的ModelMapper實例:

ModelMapper mapper = new ModelMapper(); 
mapper.addConverter(converter); 

如果你試試地圖吧,它完美的作品:

​​

輸出

SimpleDTO [firstElement = firstElement,是以lastElement =是以lastElement]


尊重你的意見,你需要檢查零點如果需要在源實例(這種情況下,如果列表爲空,則可能爲空指針)。但它可以爲您提供目標實例,即使您可以使用ProviderProviders documentation)配置目標實例的方式。

在這種特殊用例的情況下,您需要擔心空檢查和異常處理,因爲Converter我認爲是modelmapper手動映射pojos的方式。

使用ModelMapper的advantadges在其網站解釋:

  • 如果你在某些情況下,正確地配置它,它是不需要手動做圖。
  • 它集中了映射。
  • 它提供了一個用於處理特殊用例的映射API。 (這是你的情況下)
  • 等等(看看它的web
+1

謝謝!切線問題,使用ModelMapper vs使用簡單映射器方法將一個對象轉換爲另一個對象的優點是什麼?我假定我不必擔心用第三方映射器進行空檢查和異常處理,但似乎我錯了我的假設。 – Matrix

+0

@Matrix我已在回覆中發表您的評論 – Pau