2012-04-17 33 views
15

के दौरान मानचित्र में अतिरिक्त विशेषताओं को अनदेखा करें क्या ऑब्जेक्ट इंस्टेंटेशन के दौरान मानचित्र में अतिरिक्त विशेषताओं को अनदेखा करने का कोई तरीका है? उदाहरण:ग्रोवी - ऑब्जेक्ट इंस्टेंटेशन

class Banana{ 
    String name 
} 
def params = [name:'someGuy', age:13] 
new Banana(params) 

इस उदाहरण में, ग्रूवी एक ऐसी कोई विशेषता फेंकता है: उम्र अपवाद (जाहिर है क्योंकि उम्र केले कक्षा में परिभाषित नहीं है मैन्युअल रूप से निर्माता के लिए एक ही नक्शे से वांछित विशेषताओं को मैप का सहारा के बिना। केले वर्ग की, वहाँ एक रास्ता केले बताने के लिए अतिरिक्त विशेषताओं की उपेक्षा करने के लिए है?

मैंने देखा है कि Grails डोमेन कक्षाएं इस समस्या से ग्रस्त नहीं है, और मैं एक ही व्यवहार यहाँ चाहते हैं!

के लिए धन्यवाद आपकी मदद और सलाह!

उत्तर

10

दुर्भाग्यवश, ग्रोवी में ऐसा करने के लिए कोई रास्ता नहीं बनाया गया है। Grails डोमेन ऑब्जेक्ट्स के लिए अपने स्वयं के रचनाकार उत्पन्न करके करता है।

Banana(Map map) { 
    metaClass.setProperties(this, map.findAll { key, value -> this.hasProperty(key) }) 
} 
+1

जाहिर है, आप सुनिश्चित करें कि आपके पैरामीटर नक्शा कुंजी 'class' या' metaClass', या अपवाद शामिल नहीं है करना है/weirdness पीछा करेंगे ;-) –

+0

धन्यवाद - मैं इस का आनंद grails की सुविधा, मैं उम्मीद कर रहा था कि यह चतुर चाल के माध्यम से नहीं था, बल्कि इसके बजाय एक भाषा सुविधा थी। ओह अच्छा। आपका कामकाज यद्यपि चाल करना चाहिए, धन्यवाद! – Quad64Bit

2

एक और तरीका है कि प्रदर्शन को प्रभावित नहीं करता है तो सभी गुण मौजूद हैं::

public static Banana valueOf(Map<String, Object> params) { 
    try { 
     return new Banana(source) 
    } catch (MissingPropertyException e) { 
     log.info(e.getMessage()) 
     source.remove(e.property) 
     return valueOf(source) 
    } 
} 
11

इस मामले से निपटने के लिए एक सरल तरीका है एक सरल समाधान का इस तरह एक निर्माता का प्रयोग है।

अपने सेम में, बस एक विशेषता

trait IgnoreUnknownProperties { 
    def propertyMissing(String name, value){ 
     // do nothing 
    } 
} 

class Person implements IgnoreUnknownProperties { 
    String name 
} 

map = ["name": "haha", "extra": "test"] 
Person p = new Person(map) 

println p.name 
+0

इस समस्या को हल करने के लिए वास्तव में सुरुचिपूर्ण तरीका। –

+0

मैंने ग्रोवी कंसोल (v2.4.8) में सफलतापूर्वक इस दृष्टिकोण का उपयोग किया है, लेकिन जब मैं अपने ग्रोवी प्रोजेक्ट में ऐसा करने की कोशिश करता हूं तो मुझे एक java.lang.VerifyError संपत्ति के विधि हस्ताक्षर के बारे में शिकायत कर रहा है ?! क्या किसी के पास कोई विचार है? – Emil

1

@ JiankuanXing के जवाब (जो एक आदर्श जवाब :) है) करने के लिए इसी तरह के लागू, लेकिन इसके बजाय trait का उपयोग कर के अपनी कक्षा कर सकते हैं Expando प्रदान करता है और propertyMissing विधि जोड़ें :

class Banana extends Expando { 
    String name 

    def propertyMissing(name, value) { 
     // nothing 
    } 
} 
def params = [name:'someGuy', age:13] 
new Banana(params) 

trait के उपयोग शायद बेहतर इस मामले के बाद से यह व्यवहार कम्पो अनुमति देते हैं फिट बैठता है सिशन और आप trait को सभी क्लास ऑब्जेक्ट में जोड़ सकते हैं, जिसकी आवश्यकता है। मैं केवल इस विकल्प को जोड़ता हूं क्योंकि Expando का उपयोग groovy 1.5 संस्करण के बाद किया जा सकता है जबकि groovy 2.3 में पेश किया गया है।

, आशा है कि यह मदद करता है