2015-03-13 30 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); 
相关问题