[英]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.