使用Dozer转换嵌套集合

时间:2012-02-16 20:22:43

标签: java dozer

我有一个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?

感谢。

纳雷什

2 个答案:

答案 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。