簡體   English   中英

使用Dozer轉換嵌套集合

[英]Converting a nested collection using 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的類型?

謝謝。

納雷什

這實際上在他們的常見問題解答中得到了解答,但由於某種原因,它在高級部分中一直存在。 我不認為這是一個高級主題,我認為這是一件很常見的事情。 你使用集合提示來做到這一點。

映射集合時,如何告訴Dozer我想在目標集合中使用哪種類型的數據對象?

支持提示來處理此用例。 如果使用JDK 1.5 Generics,則不需要提示,因為Dozer可以自動檢測類型。 但是,如果您不使用泛型,要將Collection / Array轉換為具有不同類型對象的Collection / Array,您可以指定一個Hint,讓Dozer知道您希望在目標列表中創建的對象類型。 如果未為目標字段指定提示,則將使用與src Collection中的元素類型相同的對象填充目標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());

你應該簡單地擴展這個列表轉換。 推土機轉換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。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM