我想要做的是使用Dozer将实体列表映射到其字符串ID列表(或多或少)。
显然,它意味着Custom Converter。我的第一个想法是将一个转换器从MyEntity转换为一个String,然后对Dozer说像#34;使用这个转换器映射该集合的每个对象"。但我无法弄清楚如何做到这一点。
所以我的第二个想法是直接将转换器形成一个实体列表到一个字符串列表。我对这个想法的问题是,我正在讨论一些荒谬的事情,即在构造函数中获取我的列表类型,如下所示(它根本不起作用):
public MyEntityListConverter() {
super(List<MyEntity>.class, List<String>.class);
}
我不知道如何在一行中传递一个实例化列表的类,而不会声明任何内容。
所以如果有人知道:
答案 0 :(得分:6)
由于通用类型,您无法尝试的方式。如果是,Dozer无法在运行时检测类型。
使用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));
答案 1 :(得分:2)
另一种选择是
super((Class<List<MyEntity>>) (Class<?>) List.class,(Class<List<String>>) (Class<?>) List.class);
答案 2 :(得分:1)
我非常倾向于@Ludovic解决方案,但是我的comment up there中可能提到了一个问题。
但是,对我来说,稍作调整就可以了-在“配置”而不是字段级别注册自定义转换器。我正在使用XML config,但它应该与编码config一起使用:
<configuration>
<custom-converters>
<converter type="f.q.c.n.MyEntityToStringConverter">
<class-a>java.lang.String</class-a>
<class-b>f.q.c.n.MyEntity</class-b>
</converter>
</custom-converters>
</configuration>