2012-02-16 35 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