我有一个A类,它有一组嵌套的B类:
public class A {
private Set<B> children;
}
public class B {
private int value;
}
我还有一个C类,它有一组嵌套的D类:
public class C {
private Set<D> children;
}
public class D {
private int value;
}
现在给出A的列表,如何将其转换为C列表?理想情况下,我不应该提供任何映射提示,因为我使用泛型。例如:
List<A> src = new ArrayList<A>();
// ----- Add some A's to src -----
List<C> dst = mapper.map(src, List<C>.class);
显然,最后一行的语法不正确。它应该是什么?另外,我如何告诉Dozer要创建哪种类型的List或Set?
感谢。
纳雷什
答案 0 :(得分:4)
这实际上在他们的常见问题解答中得到了解答,但由于某些原因,它在高级部分中一直存在。我不认为这是一个高级主题,我认为这是一件很常见的事情。 You do it with a collection hint.
在映射集合时,如何告诉Dozer我想在目标集合中使用哪种类型的数据对象?
支持提示 处理这个用例。如果您使用的是JDK 1.5,则不需要提示 泛型,因为Dozer可以自动检测类型。但如果你 不使用泛型,将Collection / Array转换为 具有不同类型对象的集合/数组,您可以指定提示 让Dozer知道你想要在哪个类型的对象中创建 目的地清单。如果未为目标指定提示 字段,然后目标集合将填充对象 与src Collection中的元素类型相同。
<field> <a>someList</a> <b>otherList</b> <b-hint>org.dozer.vo.TheFirstSubClassPrime</b-hint> </field>
该答案将向您展示如何在xml中执行此操作。以下是使用Mapping实现java代码的方法:
import org.dozer.loader.api.BeanMappingBuilder;
import static org.dozer.loader.api.FieldsMappingOptions.hintB;
public class Mapping extends BeanMappingBuilder {
@Override
protected void configure() {
mapping(Subject.class, JsonSubject.class)
.fields("names", "names", hintB(JsonName.class));
}
}
提示告诉dozer,“这个A列表应该转换为列表JsonName实例”。以下是将此映射添加到映射器的方法:
mapper = new DozerBeanMapper();
mapper.addMapping(new Mapping());
答案 1 :(得分:0)
您应该简单地展开此列表转换。推土机转换JavaBeans和此类对象,而不是集合。因此,如果要传递集合,可以创建一个类似
的包装器public class EntityConverter {
private Mapper mapper;
public EntityConverter(Mapper mapper) {
this.mapper = mapper;
}
public <F, T> List<T> convert(List<F> fromList, final Class<T> toClass) {
return Lists.transform(fromList, new Function<F, T>() {
@Override
public T apply(F from) {
return convert(from, toClass);
}
});
}
public <F, T> T convert(F from, final Class<T> toClass) {
if (from == null) return null;
return mapper.map(from, toClass);
}
}
注意:此代码使用Guava。