2010-02-04 13 views
6

Załóżmy, że mam następujące klasyMapowanie głębokie właściwości z kolekcji pośrednich w spycharki

public class Baz { 
    private List<Foo> foos = new ArrayList<Foo>(); 
} 

public class Foo { 
    private String string; 
} 

public class Target { 
    private List<String> fooStrings = new ArrayList<String>(); 
} 

Czy istnieje odwzorowanie mogę użyć, aby, biorąc pod uwagę Baz, mapa go do klasy docelowej i uzyskać listę ciągów zawarte w foo w Baz? Poniższe mapowanie nie działa

<mapping> 
    <class-a>Baz</class-a> 
    <class-b>Target</class-b> 
    <field> 
    <a>foos.string</a> 
    <b>fooStrings</b> 
    </field> 
</mapping> 

Ponieważ łańcuch nie jest własnością foos (która jest typu Lista). Pomyślałbym, że Dozer byłby na tyle sprytny, gdyby napotkał kolekcję w głębokim mapowaniu, a cel był również zbiorem, aby móc podzielić nazwę głębokiej nieruchomości na dwie części i powtórzyć całą kolekcję, aby uzyskać część dla dziecka. głębokiego mapowania od członków kolekcji. Najwyraźniej nie. Czy istnieje jakieś rozwiązanie, które nie wymaga wykonania funkcji Dozera?

+0

Jak moje pytanie powieleniem pytanie zadane 3 lata po kopalni? – Jherico

+0

Możliwe powielenie przez [Głębokie odwzorowanie spychacza Ustaw na Set ] (http://stackoverflow.com/questions/14212708/dozer-deep-mapping-setcomplexobject-to-setstring). @Jherico Przepraszam za zamieszanie. Stackoverflow pozwala tylko oznaczyć post jako duplikat, jeśli drugi zawiera akceptowaną odpowiedź. – rafalmag

Odpowiedz

1

Zawsze można napisać własną wersję CustomConverter.

To ma sens, dlaczego spycharek nie jest w stanie sobie z tym poradzić, jak można się spodziewać, ponieważ w czasie wykonywania nie ma typu informacje o List foos i nie może zagwarantować, że każdy Object na liście jest rzeczywiście Foo.

+1

Nie jest zadaniem spycharki, aby upewnić się, że każdy element na liście jest rzeczywiście Foo. W rzeczywistości wcale nie musi o to dbać. Wszystko, co trzeba wiedzieć, że elementy członkowskie listy mają właściwość "ciąg" i to do mnie, deweloper, aby zapewnić, że zawsze tak jest. Pisanie niestandardowych konwerterów dla starszej wersji Dozera jest tym, co robiłem. Miałem nadzieję, że w ciągu ostatnich 2 głównych wersji Dozera ktoś poradziłby sobie z tym dość oczywistym (IMHO) przypadkiem użycia. – Jherico

0

Myślę, że możesz to zrobić bez niestandardowego konwertera.

Zastąpić metodę toString() klasy Foo jak poniżej:

@Override 
public String toString(){ 
return this.getString(); //assuming string property has a getter method. if not,write this.string 

a teraz mapowania follwing:

<mapping> 
<class-a>fully qualified name of Baz(with package name)</class-a> 
<class-b>same for Target</class-b> 
<field> 
    <a>foos</a> 
    <b>fooStrings</b> 
    <a-hint>foo</a-hint> 
    <b-hint>java.lang.String</b-hint> 
</field> 
</mapping> 
+1

To bardzo ogólne rozwiązanie. Pozwala tylko wybrać jedną właściwość na hierarchię * klasy *, która to zrobi, i zabije istniejącą funkcję toString(), co jest zazwyczaj bardzo przydatne przy debugowaniu. – Jherico

1

myślę, można napisać taki mapowanie

<mapping> 
    <class-a>Baz</class-a> 
    <class-b>Target</class-b> 
    <field> 
    <a>foos</a> 
    <b>fooStrings</b> 
    </field> 
</mapping> 

<custom-converters> 
    <converter type="CustomFooConverter"> 
    <class-a> 
     Foo 
    </class-a> 
    <class-b> 
     String 
    </class-b> 
    </converter> 
</custom-converters> 

I zaimplementuj CustomFooConverter, aby uzyskać pole ciągu foo i zwrócić je jako ciąg.

myślę, że można odpowiedzieć na wniosek w celu wspierania funkcji mapowania do prymitywów jako

<mapping> 
    <class-a>Foo</class-a> 
    <class-b>String</class-b> 
    <field> 
    <a>string</a> 
    </field> 
</mapping> 

do spycharek GitHub

Powiązane problemy