2012-07-09 12 views
5

मैं इस कोड हैग्रूवी MarkupBuilder नाम संघर्ष

<catalog xmlns='http://www.sybrium.com/XMLSchema/NodeCatalog'> 
    <groupId>sample.group</groupId> 
    <artifactId>sample-artifact</artifactId> 
    <version>1.0.0</version> 
</catalog> 

सूचना है कि "पहचान" टैग याद आ रही है ... मैं में सब कुछ कोशिश की है उस नोड को प्रकट करने के लिए दुनिया। मैं अपने बालों को फेंक रहा हूँ!

अग्रिम धन्यवाद।

उत्तर

11

एक बेहतर तरीका हो सकता है, लेकिन एक चाल invokeMethod सीधे कॉल करने के लिए है:

String buildCatalog(Catalog catalog) { 
    def writer = new StringWriter() 
    def xml = new MarkupBuilder(writer) 
    xml.catalog(xmlns:'http://www.sybrium.com/XMLSchema/NodeCatalog') { 
     delegate.invokeMethod('identity', [{ 
      groupId(catalog.groupId) 
      artifactId(catalog.artifactId) 
      version(catalog.version) 
     }]) 
    } 

    return writer.toString(); 
} 

यह ग्रूवी पर्दे के पीछे प्रभावी रूप से क्या कर रहा है है। मुझे काम करने के लिए delegate.identity या owner.identity नहीं मिल सका, जो सामान्य चाल हैं।


संपादित: मैं पता लगा क्या हो रहा है।

ग्रोवी adds a method प्रत्येक ऑब्जेक्ट पर identity(Closure c) के हस्ताक्षर के साथ।

इसका मतलब यह है कि आप गतिशील एक्सएमएल बिल्डर पर identity तत्व को लागू करने की कोशिश की जब, जबकि एक एकल बंद बहस में गुजर, यह identity() विधि है, जो बाहरी बंद पर delegate({...}) बुला की तरह है बुला रहा था।

मेटा ऑब्जेक्ट प्रोटोकॉल बाईपास और एक गतिशील पद्धति के रूप में विधि के इलाज के लिए, भले ही identity पद्धति पहले से ही MetaObject पर मौजूद है invokeMethod चाल बलों ग्रूवी का उपयोग करना।

यह जानकर, हम एक बेहतर, अधिक सुगम समाधान को एक साथ रख सकते हैं।

String buildCatalog(Catalog catalog) { 
    def writer = new StringWriter() 
    def xml = new MarkupBuilder(writer) 
    xml.catalog(xmlns:'http://www.sybrium.com/XMLSchema/NodeCatalog') { 
     // NOTE: LEAVE the empty map here to prevent calling the identity method! 
     identity([:]) { 
      groupId(catalog.groupId) 
      artifactId(catalog.artifactId) 
      version(catalog.version) 
     } 
    } 

    return writer.toString(); 
} 

यह और अधिक पठनीय है, यह स्पष्ट है मंशा, और टिप्पणी करना चाहिए (उम्मीद) किसी को भी "अनावश्यक" खाली दूर करने से रोका जा सके: सभी हम क्या करना है विधि के हस्ताक्षर बदल सकता है इसलिए की तरह है नक्शा।

+0

यह काम करता है, लेकिन क्या आप इसे समझा सकते हैं? प्रतिनिधि क्या है और प्रतिनिधि क्यों है प्रतिनिधिमंडल delegate.invokeMethod ('पहचान') से अलग है? –

+0

मैंने इसे समझ लिया, मैं अपना जवाब अपडेट करूंगा। – OverZealous

+0

एफवाईआई: एक्सएमएल ऑब्जेक्ट का निरीक्षण करने के लिए मैंने ग्रोवी कंसोल का उपयोग कर इसे ट्रैक किया। यह मुझे बताता है कि 'पहचान' विधि पहले से ही एक 'क्लोजर' के साथ इसके तर्क के रूप में मौजूद है। – OverZealous

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