2011-11-25 23 views
15

Enum के लिए मैं ऐसे enum है:डोजर स्ट्रिंग मानचित्रण

public enum PartnershipIndicator { 
    VENDOR("VENDOR"), COPARTNER("COPARTNER"), BUYER("BUYER"); 

    String code; 

    private PartnershipIndicator(String code) { 
     this.code = code; 
    } 

    public String getCode() { 
     return code; 
    } 

    public static PartnershipIndicator valueOfCode(String code) { 
     for (PartnershipIndicator status : values()) { 
      if (status.getCode().equals(code)) { 
       return status; 
      } 
     } 
     throw new IllegalArgumentException(
      "Partnership status cannot be resolved for code " + code); 
    } 

    @Override 
    public String toString() { 
     return code; 
    } 
} 

मैं इसे स्ट्रिंग के लिए और इसके विपरीत बदलना होगा। अब, यह कस्टम कनवर्टर द्वारा किया जाता है। लेकिन मैं इसे डोजर मैपिंग के माध्यम से करना चाहता हूं (यदि यह संभव है)। अगर मैं डोजर को स्वीकार करने के लिए कोई मैपिंग नहीं लिखता, तो मुझे

org.dozer.MappingException: java.lang.NoSuchMethodException: by.dev.madhead.demo.test_java.model.PartnershipIndicator.<init>() 

अपवाद मिलता है। मैं enum के लिए डिफ़ॉल्ट सार्वजनिक कन्स्ट्रक्टर नहीं जोड़ सकता, क्योंकि यह संभव नहीं है। इसलिए, मैंने आंतरिक कोड और valueOfCode()/toString() के साथ एक चाल लिखा था। यह काम नहीं करता। फिर, मैंने इसे डोजर कॉन्फ़िगरेशन में मैप किया है:

<mapping> 
    <class-a>java.lang.String</class-a> 
    <class-b create-method="valueOfCode">by.dev.madhead.demo.test_java.model.PartnershipIndicator</class-b> 
</mapping> 

यह काम नहीं करता है। मैंने valueOfCode(), एक तरफा मैपिंग की कोशिश की। कुछ भी काम नहीं करता है। स्ट्रिंग रूपांतरण के लिए Enum भी काम नहीं करता है, मैं खाली स्ट्रिंग मिलता है। कोई विचार?

+1

मैंने अपना कस्टम कनवर्टर डोजर मास्टर में जोड़ा है। तो 5.4 से कोई भी इस समस्या का सामना नहीं करेगा :) – madhead

+0

@all क्या कोई इसे देख सकता है [प्रश्न] (http://stackoverflow.com/questions/27864640/dozer-string-to-date-field-level-mapping-for -ए-सूची) – 09Q71AO534

उत्तर

19

सुनिश्चित नहीं है कि यह अभी भी एक मुद्दा है, लेकिन हो सकता है कि कोई भी खोज कर सके। लेकिन यहाँ इस का हल कार्यान्वित किया जाता है:

@Override 
public Object convert(Object destination, Object source, Class<?> destinationClass, Class<?> sourceClass) { 
    if(source == null) 
     return null; 
    if(destinationClass != null){ 
     if(destinationClass.getSimpleName().equalsIgnoreCase("String")){ 
      return this.getString(source); 
     }else if(destinationClass.isEnum()){ 

      return this.getEnum(destinationClass, source); 

     }else{ 
      throw new MappingException(new StrBuilder("Converter ").append(this.getClass().getSimpleName()) 
         .append(" was used incorrectly. Arguments were: ") 
         .append(destinationClass.getClass().getName()) 
         .append(" and ") 
         .append(source).toString()); 
     } 
    } 
    return null; 
} 

private Object getString(Object object){ 
    String value = object.toString(); 
    return value; 
} 
private Object getEnum(Class<?> destinationClass, Object source){ 
    Object enumeration = null; 

    Method [] ms = destinationClass.getMethods(); 
    for(Method m : ms){ 
     if(m.getName().equalsIgnoreCase("valueOf")){ 
      try { 
       enumeration = m.invoke(destinationClass.getClass(), (String)source); 
      } 
      catch (IllegalArgumentException e) { 
       e.printStackTrace(); 
      } 
      catch (IllegalAccessException e) { 
       e.printStackTrace(); 
      } 
      catch (InvocationTargetException e) { 
       e.printStackTrace(); 
      } 
      return enumeration; 
     } 
    } 
    return null; 
} 

StrBuilder वर्ग जब अपवाद संदेश के निर्माण अपाचे आम-लैंग libs से है। लेकिन इसके अलावा इस मुद्दे को हल करने के लिए एक सरल प्रतिबिंब।

<configuration> 
    <custom-converters> 
     <converter type="com.yourcompany.manager.utils.dozer.converters.EnumStringBiDirectionalDozerConverter"> 
      <class-a>java.lang.Enum</class-a> 
      <class-b>java.lang.String</class-b> 
     </converter> 
    </custom-converters> 
</configuration> 

ध्यान दें कि आप केवल अपने मानचित्रण सभी फ़ाइलों के बीच एक बार एक विन्यास सूचीबद्ध कर सकते हैं (यदि आप एक से अधिक है) अन्यथा: बस एक वर्ग है कि CustomConverter लागू करता है और फिर अपने डोजर मानचित्रण एक्सएमएल फ़ाइल में निम्न विन्यास जोड़ने के लिए जोड़ें डोजर शिकायत करेगा। मैं आमतौर पर जो करता हूं वह सरलता के लिए एक फ़ाइल में मेरी कस्टम कनवर्टर कॉन्फ़िगरेशन रखता है। उम्मीद है की यह मदद करेगा!

4

डोज़र में स्ट्रिंग मैपिंग के लिए एक डिफ़ॉल्ट enum नहीं है। डोज़र डॉक्स से Data type conversion देखें। तो आपके पास दो विकल्प हैं:

  • आप एक कस्टम कनवर्टर लिख सकते हैं जो किसी भी enum को संभालने के लिए जेनरिक का उपयोग करता है।
  • या, आप enzer < -> डिफ़ॉल्ट मैपिंग में स्ट्रिंग मैपिंग जोड़ने के लिए डोज़र को पैच सबमिट कर सकते हैं।
+0

ऐसा लगता है कि 2018 में यह अभी भी सच है। डोजर प्रोजेक्ट निष्क्रिय दिखता है। हम अपने वर्तमान प्रोजेक्ट में मॉडलमैपर का उपयोग करते हैं। –

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