Java 使用推土机转换嵌套集合

Java 使用推土机转换嵌套集合,java,dozer,Java,Dozer,我有一个类a,它有一组嵌套的类B: public class A { private Set<B> children; } public class B { private int value; } 公共A类{ 私人儿童; } 公共B级{ 私有int值; } 我还有一个C类,它有一组嵌套的D类: public class C { private Set<D> children; } public class D { private

我有一个类a,它有一组嵌套的类B:

public class A {
    private Set<B> children;
}

public class B {
    private int value;
}
公共A类{
私人儿童;
}
公共B级{
私有int值;
}
我还有一个C类,它有一组嵌套的D类:

public class C {
    private Set<D> children;
}

public class D {
    private int value;
}
公共C类{
私人儿童;
}
D类公共服务{
私有int值;
}
现在给定一个a的列表,如何将其转换为C的列表?理想情况下,我不必提供任何映射提示,因为我使用的是泛型。例如:

List<A> src = new ArrayList<A>();
// ----- Add some A's to src -----
List<C> dst = mapper.map(src, List<C>.class);
List src=new ArrayList();
//-----在src中添加一些A-----
List dst=mapper.map(src,List.class);
显然,最后一行的语法不正确。应该是什么?还有,我如何告诉推土机要创建什么类型的列表或集合

谢谢


Naresh

您只需扩展此列表转换即可。Dozer转换JavaBean和这样的对象,而不是集合。因此,如果要传递集合,可以创建一个包装器,如

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);
    }
}
公共类EntityConverter{
私人制图员;
公共实体转换程序(映射器映射器){
this.mapper=mapper;
}
公共列表转换(列表从列表,最终类到类){
return list.transform(fromList,new Function()){
@凌驾
公共交通工具不适用(F从){
返回转换(从、到类);
}
});
}
公共T转换(F from,最终类到类){
if(from==null)返回null;
返回mapper.map(from,toClass);
}
}

注意:这段代码使用番石榴。

这实际上在他们的常见问题解答中得到了回答,但由于某些原因,它一直在高级部分中。我不认为这是一个高级的话题,我认为这是一个普通的事情想做

映射集合时,如何告诉Dozer目标集合中需要什么类型的数据对象? 支持提示以 处理这个用例。如果您使用的是JDK1.5,则不需要提示 因为类型可以由推土机自动检测。但是如果你 不使用泛型将集合/数组转换为 具有不同类型对象的集合/数组,可以为其指定提示 让推土机知道要在中创建什么类型的对象 目的地列表。如果未为目标指定提示 字段,则目标集合将填充对象 与src集合中的元素类型相同

<field>
  <a>someList</a>
  <b>otherList</b> 
  <b-hint>org.dozer.vo.TheFirstSubClassPrime</b-hint> 
</field>
提示告诉dozer,“这个A的列表应该转换为一个列表JsonName实例”。以下是如何将此映射添加到映射器:

    mapper = new DozerBeanMapper();
    mapper.addMapping(new Mapping());

“你知道吗?”马修斯密斯看到我下面的回答完全符合预期。我正在使用此in-dropwizard将我的域POJO转换为表示形式,并具有嵌套表示形式。你必须小心你的懒惰+渴望装载仍然,但推土机携带你需要的一切,并将使用这个暗示你的嵌套表示。
    mapper = new DozerBeanMapper();
    mapper.addMapping(new Mapping());