2010-03-17 12 views
14

में grails सेवा का उपयोग करना मैं अपने Grails आवेदन में एक सेवा का उपयोग करना चाहता हूँ। हालांकि, यह हमेशा शून्य है। मैं Grails संस्करण 1.1 का उपयोग कर रहा हूँ। इस समस्या का समाधान किस प्रकार से किया जा सकता है?डोमेन कक्षा

नमूना कोड:

class A{ 
     String name; 
     def testService; 
     static transients=['testService'] 
} 

मैं एक डोमेन वर्ग के भीतर एक सेवा का उपयोग कर सकते हैं?

उत्तर

24

यह काम करना चाहिए। ध्यान दें कि चूंकि आप 'def' का उपयोग कर रहे हैं, इसलिए आपको इसे transients सूची में जोड़ने की आवश्यकता नहीं है। क्या आप इसे स्थिर विधि से एक्सेस करने का प्रयास कर रहे हैं? यह एक उदाहरण फ़ील्ड है, इसलिए आप इसे केवल उदाहरणों से एक्सेस कर सकते हैं।

डोमेन क्लास में किसी सेवा को इंजेक्शन देने के लिए सामान्य उपयोग केस सत्यापन के लिए है। एक कस्टम सत्यापनकर्ता डोमेन वर्ग उदाहरण सत्यापित किया जा रहा पारित कर दिया जाता है, ताकि आप उस से सेवा का उपयोग कर सकते हैं:

static constraints = { 
    name validator: { value, obj -> 
     if (obj.testService.someMethod(value)) { 
     ... 
     } 
    } 
} 
+0

हाय मैं इसे डिफ़ॉल्ट पर लोड = {} बंद करने से एक्सेस करने का प्रयास कर रहा हूं। – DonX

+3

ऐसा लगता है कि निर्भरता इंजेक्शन ऑनलोड ईवेंट के बाद होता है, इसलिए आपको इसके बजाय एप्लिकेशन संदर्भ से खींचने की आवश्यकता होगी। यह आयात जोड़ें: "आयात करें org.codehaus.groovy.grails.commons.AhplicationHolder एएच के रूप में" और फिर अपने ऑनलोड में आप सेवा को "def testService = AH.application.mainContext.testService" –

10

कम जवाब है। हां आप डोमेन क्लास के अंदर सेवा का उपयोग कर सकते हैं।

यहां एक नमूना कोड है जहां डोमेन क्लास को एसीजी प्लगइन से प्रमाणीकृत सेवा तक पहुंच प्राप्त होती है। यह बिना किसी समस्या के काम करता है।

class Deal { 
    def authenticateService 

    def afterInsert() { 
     def user = authenticateService.userDomain(); 
     .... 
    } 
.... 
} 
+0

के रूप में संदर्भित कर सकते हैं यह वास्तव में बेहतर उत्तर है ! मेरे पास पूरी चीज पीछे थी। मुझे सेवा से डीबी तक पहुंचने की कोशिश नहीं करनी चाहिए, मुझे डोमेन क्लास में सेवा इंजेक्ट करनी चाहिए और कोड के बाद कोड को "ट्रिगर्स" के साथ चलाने के बाद, जैसा कि आप इंगित करते हैं। –

1

बर्ट और रेमिस के उत्तर संक्षेप में: डोमेन कस्टम सत्यापनकर्ता में, आप के बजाय obj.testService का उपयोग सीधे testService उपयोग करना होगा। आप डोमेन कस्टम सत्यापनकर्ता में करना चाहते हैं उपयोग सेवा हैं:

static constraints = { 
    name validator: { value, obj -> 
     if (obj.testService.someMethod(value)) { 
     ... 
     } 
    } 
} 

लेकिन afterInsert और अन्य निजी/सार्वजनिक उपाय अपना सकते हैं अन्य तरीकों, में, का उपयोग testService ठीक है।

def someMethod() { 
    def user = testService.serviceMethod(); 
    .... 
} 
संबंधित मुद्दे