2015-03-13 45 views
4

我想要做的是使用推土機將實體列表映射到其字符串ID列表(或多或少)。使用推土機的自定義轉換器將對象列表映射到另一個列表

顯然,這意味着自定義轉換器。我的第一個想法是將一個轉換器從MyEntity轉換爲一個字符串,然後對Dozer說道:「使用這個轉換器映射這個集合的每個對象」。但我無法弄清楚如何去做。

所以我的第二個想法是讓轉換器直接將一個實體列表形成一個字符串列表。我對這個想法的問題是,我是strugling的東西可笑的是讓我的列表類型在構造函數中,如下(不工作在所有):

public MyEntityListConverter() { 
    super(List<MyEntity>.class, List<String>.class); 
} 

我不知道如何在單行中傳遞實例化的列表類,而不會聲明任何內容。

因此,如果有人知道或者:

  • 如何指定推土機對象轉換器中收集映射使用
  • 如何獲得實例列表類型
  • 第三/更好的解決方案來嘗試

回答

6

由於泛型類型,您嘗試的方式不可行。如果是,Dozer無法在運行時檢測類型。

1解決方案List<>

你的轉換器:

public class MyEntityToStringConverter extends DozerConverter<MyEntity, String> { 
    // TODO constructor + impl 
} 

您的映射:

mapping(MyEntityA.class, MyEntityB.class) 
.fields("myEntityList", "myStringList", 
    hintA(MyEntity.class), 
    hintB(String.class)); 

mapping(MyEntity.class, String.class) 
.fields(this_(), this_(), customConverter(MyEntityToStringConverter.class)); 

第二個解決方案與列表包裝

您可以嘗試創建擴展列表impl的自定義類。

public class MyEntityList extends ArrayList<MyEntity> { 

} 

public class MyStringList extends ArrayList<String> { 

} 

更改您想要映射的父類中的字段。

你的轉換器:

public class MyEntityToStringConverter extends DozerConverter<MyEntityList, MyStringList> { 
    // TODO constructor + impl 
} 

您的映射:

mapping(MyEntityA.class, MyEntityB.class) 
.fields("myEntityList", "myStringList", customConverter(MyEntityToStringConverter.class)); 
+0

感謝隊友,我不能嘗試一下,我不是這個項目了,但我很確定它會起作用,所以我接受了答案。 – tanou 2015-03-30 07:44:47

1

另一種選擇是

super((Class<List<MyEntity>>) (Class<?>) List.class,(Class<List<String>>) (Class<?>) List.class);