使用Dozer的自定义转换器将对象列表映射到另一个列表
我想要做的是使用Dozer将实体列表映射到它们的字符串ID列表(或多或少)。
显然,它意味着Custom Converter。 我的第一个想法是从MyEntity转换为String,然后对Dozer说“使用这个转换器映射此集合的每个对象”。 但我无法弄清楚如何做到这一点。
所以我的第二个想法是直接将转换器形成一个实体列表到一个字符串列表。 我对这个想法的问题是,我正在讨论一些荒谬的东西,即在构造函数中获取我的列表类型,如下所示(根本不起作用):
public MyEntityListConverter() { super(List.class, List.class); }
我不知道如何在一行中传递一个实例化列表的类,而不会声明任何内容。
所以如果有人知道:
- 如何指定dozer一个在集合映射中使用的对象转换器
- 如何获取实例化列表类型
- 尝试的第三种/更好的解决方案
由于generics类型,您无法尝试的方式。 如果是,Dozer无法在运行时检测类型。
List<>
第一个解决方案
你的转换器:
public class MyEntityToStringConverter extends DozerConverter { // 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 { } public class MyStringList extends ArrayList { }
更改要映射的父类中的字段。
你的转换器:
public class MyEntityToStringConverter extends DozerConverter { // TODO constructor + impl }
你的映射:
mapping(MyEntityA.class, MyEntityB.class) .fields("myEntityList", "myStringList", customConverter(MyEntityToStringConverter.class));
另一种选择是
super((Class>) (Class>) List.class,(Class>) (Class>) List.class);