2010-01-29 16 views
9

में एक फ़ंक्शन के रूप में एक टैगलिब को कॉल करने के लिए कैसे करें मुझे अपने डोमेन क्लास से स्टेटिक रिसोर्सेज प्लगइन (http://www.grails.org/Static+Resources+Plugin) पर कॉल करने की आवश्यकता है।एक डोमेन क्लास

यह एक नियंत्रक में पूरी तरह से काम करता है:

def tstLink = resourceLinkTo(dir:"docs/${identifier}",file:originalFileName) 

परंतु एक डोमेन कक्षा में मैं

Exception Message: No signature of method: static org.maflt.ibidem.Item.resourceLinkTo() is applicable for argument types: (java.util.LinkedHashMap) values: [[dir:docs/19e9ea9d-5fae-4a35-80a2-daedfbc7c2c2, file:2009-11-12_1552.png]] 

मिल मुझे लगता है कि यह एक सामान्य समस्या है।

तो आप एक डोमेन क्लास में फ़ंक्शन के रूप में टैगलिब को कैसे कॉल करते हैं?

+0

मैं सिर्फ क्या मैं एक सेवा विधि में टैग के लिए एक कॉल डाल रहा था कर समाप्त हो गया एक ही सटीक समस्या के खिलाफ भाग गया और तुम्हारा ढूंढने से पहले इस सवाल को खुद से पूछने वाला था। –

+1

स्वीकार्य उत्तर सामान्य टैगलिब कॉल के लिए अच्छा है, लेकिन लिंक बनाने के विशिष्ट उपयोग-मामले के लिए आप अपनी सेवा कक्षा में 'grailsLinkGenerator' बीन' को अपनी सेवा कक्षा में केवल 'def grailsLinkGenerator' द्वारा प्राप्त कर सकते हैं। फिर आप 'लिंक' विधि को कॉल कर सकते हैं और इसे पैरामीटर पास कर सकते हैं, या 'serverBaseURL' प्रॉपर्टी तक पहुंच सकते हैं। –

+0

@TedNaleid यह विकल्प उस समय उपलब्ध नहीं हो सकता जब मैंने अपना उत्तर लिखा था। वह क्लीनर दृष्टिकोण होगा। –

उत्तर

11

मुझे कुछ समय पहले इस समस्या का सामना करना पड़ा था जिस पर मैं काम कर रहा था।

class MyService { 
    def grailsApplication //autowired by spring 

    def methodThatUsesATag(identifier, originalFileName) { 
     //This is the default grails tag library 
     def g = grailsApplication.mainContext.getBean('org.codehaus.groovy.grails.plugins.web.taglib.ApplicationTagLib') 

     g.resourceLinkTo(dir:"docs/${identifier}",file:originalFileName) 
    } 
} 

तब मेरे डोमेन वर्ग में, मैं वसंत autowiring के माध्यम से सेवा करने के साथ मिल सकता है:

class MyDomain { 
    String originalFileName 
    def myService //autowired 

    static transients = ['myService'] //Necessary so that GORM doesn't try to persist the service instance. 

    //You can create a method at this point that uses your 
    //service to return what you need from the domain instance. 
    def myMethod() { 
     myService.methodThatUsesATag(id, originalFileName) 
    } 
} 
+0

आप सीधे डोमेन ऑब्जेक्ट्स में उसी निर्भरता इंजेक्शन का उपयोग कर सकते हैं - आपको अपने लिए काम करने के लिए किसी सेवा का उपयोग करने की आवश्यकता नहीं है। –

+0

यह अब सच हो सकता है। यह तब नहीं था जब मैंने मूल रूप से इस सवाल का जवाब दिया था। –

+1

मैंने तब से यह भी पाया है कि आप GrailsApplication प्राप्त करने के लिए डोमेन ऑब्जेक्ट (या domainClass.grailsApliction) से GetDraainClass() प्राप्त करें। GetGrails एप्लिकेशन()। ऐसा लगता है कि यह Grails 2.0 के साथ उपलब्ध हो गया –

-1

अधिकतर टैगलिब नियंत्रक से डेटा पर भरोसा करते हैं, इसलिए अक्सर उन्हें पुन: उपयोग करना संभव नहीं होता है जबकि अन्य लोग तर्क को देखते हैं, अक्सर यह ऐसा कुछ नहीं है जिसे आप डोमेन क्लास में रखना चाहते हैं।

जिसके अनुसार, मुझे यकीन है कि आप अपने कारणों तो शायद taglib के स्रोत में मदद मिलेगी है कर रहा हूँ:

class ResourceTagLib { 

    def externalResourceServerService 

    def resourceLinkTo = { attrs -> 
     out << externalResourceServerService.uri 
     out << '/' 
     if(attrs['dir']) { 
      out << "${attrs['dir']}/" 
     } 
     if(attrs['file']) { 
      out << "${attrs['file']}" 
     } 
    } 
} 

यानी आपके डोमेन वर्ग में externalResourceServerService इंजेक्षन और बाकी सरल होना चाहिए।

+0

धन्यवाद। मैं भी काम करने की उम्मीद करता था। मैंने किया था डीईएफ़ tstLink = externalResourceServerService.resourceLinkTo (dir: "डॉक्स/$ {पहचानकर्ता}", फ़ाइल: originalFileName) लेकिन मिला विधि का कोई हस्ताक्षर नहीं: ExternalResourceServerService.resourceLinkTo() तर्क प्रकार के लिए लागू होता है: (जावा .util.LinkedHashMap) मान: [[dir: docs/279a5b71-b05f-4d62-be7b-72a805b005e0, फ़ाइल: me.jpeg]] –

+0

तो ऐसा लगता है कि मुझे डेटा प्रकारों को सही करने की आवश्यकता है। यह या तो tstLink2 = बाहरीResourceServerService.resourceLinkTo ("दस्तावेज़/$ {पहचानकर्ता}"। ToString(), originalFileName) toString() के साथ या उसके बिना काम नहीं करता है। –

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