4

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

谢谢。

纳雷什

4

2 回答 2

4

这实际上在他们的常见问题解答中得到了回答,但由于某种原因,它一直在高级部分中。我不认为这是一个高级话题,我认为这是一件很平常的事情。 您可以通过收集提示来完成。

映射集合时,我如何告诉 Dozer 我想要目标集合中的数据对象类型?

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

<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());
于 2013-05-07T00:10:00.607 回答
0

您应该简单地展开这个列表转换。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);
    }
}

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

于 2013-01-11T00:25:48.450 回答