2012-02-16 78 views
3

嵌套集合我有一个类A,其具有一组嵌套的B类:转换使用推土机

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

public class B { 
    private int value; 
} 

我也有其具有一组嵌套d类的类C:

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); 

很明显,最后一行的语法不正确。它应该是什么?我又该如何告诉推土机什么类型的List或Set要创建?

谢谢。

Naresh

+0

你有没有想过这个? – 2012-11-16 23:21:45

+0

@MthetheSmith在下面看到我的回答 – 2013-05-07 00:10:14

回答

0

您应该简单地扩展此列表转换。 Dozer转换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); 
    } 
} 

注意:此代码使用番石榴。

3

这实际上是在其常见问题解答中回答的,但由于某种原因,它在高级部分中一直处于低谷。我不认为这是一个高级话题,我认为这是一件很平常的事。 You do it with a collection hint.

映射集合时,如何告知Dozer目标集合中需要什么类型的数据对象?

提示支持 处理这个用例。如果您使用的是JDK 1.5 泛型,则不需要提示,因为Dozer可以自动检测类型。但是,如果 未使用泛型,请使用不同类型的对象将集合/数组转换为 集合/数组,您可以指定提示 让让Dozer知道您要在目标列表中创建的对象类型。如果未为目标 字段指定提示,则目标集合将填充与对象集合中的元素类型相同的对象 。

<field> 
    <a>someList</a> 
    <b>otherList</b> 
    <b-hint>org.dozer.vo.TheFirstSubClassPrime</b-hint> 
</field> 

这个答案告诉您如何做到这一点的XML。这里是你如何可以与一个映射做到在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)); 
    } 
} 

的提示告诉推土机,“A公司的这份名单应该转换到一个列表JsonName实例”。以下是将此映射添加到映射器的方法:

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

完全按照预期工作。我在dropwizard中使用它来将我的域POJO转换为表示并嵌套表示。你仍然需要小心你的懒惰+急切的加载,但推土机会携带你需要的所有东西,并且会用这个暗示来使用你的嵌套表示。 – gspatel 2014-04-18 02:57:07