2012-10-31 24 views
6

से Access Config.groovy जब मेरा Grails ऐप शुरू होता है, तो मैं पृष्ठभूमि में स्प्रिंग एकीकरण और बैच प्रक्रिया भी शुरू करता हूं। मैं Config.groovy फ़ाइल में संग्रहीत कुछ डीबी कनेक्शन गुणों को रखना चाहता हूं, लेकिन मैं उन्हें टेक एकीकरण/बैच प्रक्रिया में उपयोग की जाने वाली जावा क्लास से कैसे एक्सेस करूं?जावा क्लास

Converting Java -> Grails ... How do I load these properties?

जिससे पता चलता है का उपयोग करते हुए:

private Map config = ConfigurationHolder.getFlatConfig(); 

की तरह कुछ के द्वारा पीछा किया:

मैं इस सूत्र पाया

String driver = (String) config.get("jdbc.driver"); 

यह वास्तव में ठीक काम करता है (तेह गुण भरी हुई हैं Config.groovy से ठीक से) लेकिन समस्या टी है टोपी कॉन्फ़िगरेशनहोल्डर को बहिष्कृत करने के बाद है।

How to access Grails configuration in Grails 2.0?

तो वहाँ एक गैर पदावनत रास्ता तक पहुँच प्राप्त करने के लिए है: और किसी भी धागा मैं इस मुद्दे के साथ काम कर पाया है Grails विशिष्ट हो सकता है और इस सूत्र में dependancy इंजेक्शन का उपयोग कर, की तरह का सुझाव करने लगता है जावा क्लास फ़ाइल से Config.groovy गुण?

+0

[आपके द्वारा लिंक किए गए प्रश्न के स्वीकृत उत्तर] में दूसरी विधि के साथ क्या गलत है (http://stackoverflow.com/a/7136095/6509)? –

+0

हाय टिम, उत्तर देने के लिए चीयर्स। मैंने अपनी जावा कक्षा में संसाधन फ़ाइल में एक बीन के रूप में रखा है (grails की संपत्ति के साथ आवेदन और grails आवेदन का एक रेफरी), और मेरी कक्षा में निम्नलिखित पंक्ति जोड़ा: निजी Grails आवेदन grails आवेदन; गेटर और सेटर के साथ। लेकिन जब मैं इसे ConfigObject config = grailsApplication.getConfig() के माध्यम से एक्सेस करने का प्रयास करता हूं; ऐसा लगता है कि यह शून्य और त्रुटियों से बाहर है। कोई विचार क्या मैं गलत कर रहा हूँ? धन्यवाद – Illu

+0

आप इसे एक्सेस करने का प्रयास कर रहे हैं? आप कन्स्ट्रक्टर में निर्भरता-इंजेक्शन वाले बीन्स का उपयोग नहीं कर सकते हैं, उदाहरण के लिए, आपको '@ पोस्टकॉन्स्ट्रक्चर 'के साथ एनोटेटेड विधि घोषित करने की आवश्यकता है और उस तर्क को डालने की आवश्यकता है जिसके बजाय वहां' grailsAplication 'की आवश्यकता है, या वैकल्पिक रूप से कन्स्ट्रक्टर तर्क इंजेक्शन का उपयोग करें सेटर इंजेक्शन। –

उत्तर

1

मैं काम नहीं कर सकता कि यह क्यों काम नहीं कर रहा है, लेकिन मैं पूरी तरह से एक वैकल्पिक दृष्टिकोण का सुझाव दे सकता हूं। Grails एक PropertyPlaceholderConfigurer कि grailsApplication.config से अपने मूल्यों को ले जाता है निर्धारित करता है, तो आप अपने वर्ग पर एक

public void setDriver(String driver) { ... } 

घोषित कर सकता है और उसके बाद

<bean class="com.example.MyClass" id="exampleBean"> 
    <property name="driver" value="${jdbc.driver}" /> 
</bean> 

यह भी resources.groovy में काम करता है आप सेम उपयोग कर रहे हैं का कहना है कि डीएसएल, लेकिन आप दोगुने से एकल उद्धरण उपयोग करने के लिए नहीं बल्कि याद रखना चाहिए:

exampleBean(MyClass) { 
    driver = '${jdbc.driver}' 
} 

"${jdbc.driver}" का उपयोग करना काम नहीं करता है क्योंकि ग्रोवी द्वारा जीएसआरई के रूप में इसका अर्थ मिलता है और resources.groovy संसाधित होने पर हल हो जाता है, जबकि आपको जो चाहिए वह एक शाब्दिक ${...} अभिव्यक्ति को प्लेसहोल्डर द्वारा बाद में हल करने के लिए संपत्ति मूल्य के रूप में रखना है configurer।

3

बस मेरे मौजूदा कोड में से कुछ में जाँच की है, और मैं का उपयोग this method described by Burt Beckwith

एक नई फ़ाइल बनाएं: src/groovy/ctx/ApplicationContextHolder.groovy

package ctx 

import org.springframework.context.ApplicationContext 
import org.springframework.context.ApplicationContextAware 
import javax.servlet.ServletContext 

import org.codehaus.groovy.grails.commons.GrailsApplication 
import org.codehaus.groovy.grails.plugins.GrailsPluginManager 
import org.springframework.context.ApplicationContext 
import org.springframework.context.ApplicationContextAware 

@Singleton 
class ApplicationContextHolder implements ApplicationContextAware { 
    private ApplicationContext ctx 

    private static final Map<String, Object> TEST_BEANS = [:] 

    void setApplicationContext(ApplicationContext applicationContext) { 
    ctx = applicationContext 
    } 

    static ApplicationContext getApplicationContext() { 
    getInstance().ctx 
    } 

    static Object getBean(String name) { 
    TEST_BEANS[name] ?: getApplicationContext().getBean(name) 
    } 

    static GrailsApplication getGrailsApplication() { 
    getBean('grailsApplication') 
    } 

    static ConfigObject getConfig() { 
    getGrailsApplication().config 
    } 

    static ServletContext getServletContext() { 
    getBean('servletContext') 
    } 

    static GrailsPluginManager getPluginManager() { 
    getBean('pluginManager') 
    } 

    // For testing 
    static void registerTestBean(String name, bean) { 
    TEST_BEANS[name] = bean 
    } 

    // For testing 
    static void unregisterTestBeans() { 
    TEST_BEANS.clear() 
    } 
} 

फिर, grails-app/config/spring/resources.groovy संपादित शामिल करने के लिए:

applicationContextHolder(ctx.ApplicationContextHolder) { bean -> 
    bean.factoryMethod = 'getInstance' 
    } 

फिर, src/java या src/groovy के अंदर आपकी फ़ाइलों में, आप कॉल कर सकते हैं:

GrailsApplication app = ApplicationContextHolder.getGrailsApplication() ; 
ConfigObject config = app.getConfig() ; 
4

पंजीकरण करने के लिए बस Grails 2.x में, Holders class है जो इस बहिष्कृत धारक को प्रतिस्थापित करता है। आप एक स्थिर संदर्भ में grailsApplication तक पहुंचने के लिए इसका उपयोग कर सकते हैं।

+0

यह बर्ट के [ApplicationContextHolder] (http://burtbeckwith.com/blog/?p=1017) को प्रतिस्थापित करने के लिए प्रतीत होता है क्योंकि यह उस समाधान से अधिकतर प्रदान करता है, स्थिर असाइनमेंट समस्या को भी संबोधित करता है। – raffian

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