2010-12-03 16 views
6

मैं एक स्रोत ऑब्जेक्ट जो है:डोजर मानचित्रण HashMap <Key,Value> सूची में <Value>

public class Source { 
    public Map<String,DTO>getDTOs(); 
} 

और एक गंतव्य वस्तु:

public class Destination { 
    public List<DTO> getDTOs(); 
    public void setDTOs(List<DTO> dtos); 
} 

मैं मेरे लिए यह मानचित्रण करने के लिए डोजर उपयोग करने के लिए कोशिश कर रहा हूँ , लेकिन मैं स्टंप की तरह हूँ। मैंने यूनिट परीक्षणों और केवल दस्तावेजों का परीक्षण किया है, लेकिन मेरी चुनौती यह है कि मुझे बिल्कुल यकीन नहीं है कि मैं क्या देख रहा हूं।

उत्तर

6

आम तौर पर, डोजर मैपिंग पसंद करता है, विशेष रूप से जहां तक ​​डेटा संरचनाएं जाती हैं। इससे आपकी समस्या एक मुश्किल हो जाती है।

इसमें कोई संदेह नहीं है कि आपने java.util.Map को java.util.Map पर मैपिंग पर पढ़ा है। यदि आपके पास दोनों सिरों पर मानचित्र हैं तो यह बहुत अच्छा काम करता है। दुर्भाग्यवश, सभी राजाओं के मानचित्र-सेट-विधि और सभी राजा पुरुष आपको java.util.Mapil करने के लिए java.util.List रूपांतरण करने में मदद करने की संभावना नहीं रखते हैं। Dozer गंतव्य और Map.put (कुंजी, मान) गंतव्य से Map.get (कुंजी) करना चाहता है। चूंकि सूची पुट गेम नहीं खेलती है, इसलिए आप जाम कर रहे हैं (मैं इसे 'एड()' के साथ सफलतापूर्वक नकली करने में सक्षम नहीं था ... शायद कोई रास्ता है?)।

http://dozer.sourceforge.net/documentation/customconverter.html के नीचे "डेटा संरचना रूपांतरण" पर एक अनुभाग है, जो आपकी समस्या जैसा दिखता है। जब जवाब "कस्टम मैपिंग लिखना" होता है, तो शायद मुझे बहुत मदद नहीं मिल रही है, लेकिन मुझे आपका कोड निम्न सेटअप के साथ काम करने के लिए मिला है।

क्या आपके पास डोजर xml में ऐसा करने के साथ कोई भाग्य है?

<mapping> 
    <class-a>Source</class-a> 
    <class-b>Destination</class-b> 
    <field custom-converter="HashMapToListConverter"> 
     <a>dtos</a> <!-- This is a Map<String,DTO> --> 
     <b>dtos</b> <!-- This is a List<DTOPrime> --> 
     <a-hint>java.util.LinkedHashMap</a-hint> 
     <b-hint>java.util.ArrayList</b-hint> 
    </field> 
    </mapping> 



import org.dozer.*; 
import java.util.*; 

public class HashMapToListConverter extends DozerConverter<Map, List> implements MapperAware { 

    private Mapper mapper; 

    public HashMapToListConverter() { 
    super(Map.class, List.class); 
    } 

    public List convertTo(Map source, List destination) { 
    List<DTOPrime> convertedList = new ArrayList<DTOPrime>(); 
    for (Object object : source.values()) { 
     DTO item = (DTO)object; 
     DTOPrime mappedItem = mapper.map(item, DTOPrime.class); 
     convertedList.add(mappedItem); 
    } 
    return convertedList; 
    } 

    public Map convertFrom(List source, Map destination) { 
    Map<String, DTO> originalToMapped = new LinkedHashMap<String, DTO>(); 
    for (Object object : source) { 
     DTOPrime item = (DTOPrime)object; 
     DTO mappedItem = mapper.map(item, DTO.class); 
     originalToMapped.put(mappedItem.getData(), mappedItem); // FIXME: Since the mapping is lossy, you can decide what the keys of your map are for the reverse mapping... 
    } 
    return originalToMapped; 
    } 

    public void setMapper(Mapper mapper) { 
    this.mapper = mapper; 
    } 

} 
+2

एक उदासी जवाब; मैं उम्मीद कर रहा था कि एक आसान तरीका था - लेकिन यह वही है जो मैं कर रहा था। मुझे आश्चर्य है कि कितने अन्य ने ऐसा किया है। – Idcmp

0

क्या आपने कोशिश की है?

destination.setDTOs(new ArrayList<DTO>(source.getDTOs().values())); 

यह स्पष्ट नहीं है कि आप क्या करने की कोशिश कर रहे हैं।

+1

यह विशेष रूप से डोजर के साथ इस मानचित्रण कर रहा है - http://dozer.sf.net/ – Idcmp

संबंधित मुद्दे