2012-10-31 7 views
6

Grails uygulamam başladığında, arka planda bir Spring Integration ve Batch işlemini başlatıyorum. Config.groovy dosyasında saklanan bazı DB bağlantı özelliklerine sahip olmak istiyorum, ancak Entegrasyon/Toplu işlemde kullanılan bir Java sınıfından bunlara nasıl erişebilirim?Java sınıfından yapılandırma Config.groovy

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

kullanarak önerir:

private Map config = ConfigurationHolder.getFlatConfig(); 

gibi bir şey ardından:

Ben Konuyu buldum

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

Bu gerçekten iyi çalışıyor (teh özellikler yüklenmeden Config.groovy dan doğru) ama sorun t hat YapılandırmaHolder, kullanımdan kaldırıldıktan sonra. Yani erişmek için olmayan bir kaldırılmış yolu

How to access Grails configuration in Grails 2.0?

vardır: Ve konuyla ilgilenen bulundu olduğunuz herhangi iplik Grails özgü olması ve bu iplik gibi dependancy enjeksiyon kullanarak önermek gibi görünüyor Bir Java sınıf dosyasından Config.groovy özellikleri?

+0

Bağlandığınız sorunun kabul edilen yanıtında ikinci yöntemde yanlışlık var (http://stackoverflow.com/a/7136095/6509)? –

+0

Merhaba Tim, cevap için alkış. Kaynak dosyasında (grailsApplication özelliği ve grailsApplication özelliği ile) java sınıfımı bir fasulye olarak koydum ve şu satırı ekledim: private GrailsApplication grailsApplication; alıcı ve ayarlayıcı ile. Ancak ConfigObject config = grailsApplication.getConfig() aracılığıyla erişmeye çalıştığımda; boş ve hatalar gibi görünüyor. Yanlış yaptığım herhangi bir fikrin var mı? Teşekkürler – Illu

+0

Nereye erişmeye çalışıyorsunuz? Bağımlılık-enjekte edilmiş fasülyeleri yapıcıda kullanamazsınız, örneğin, '@ PostConstruct' ile açıklamalı bir yöntem bildirmeniz ve bunun yerine 'grailsApplication' gerektiren mantığı koymanız ya da alternatif olarak yerine constructor argümanı enjeksiyonu kullanmanız gerekir. setter enjeksiyonu. –

cevap

1

Bunun neden çalışmadığını anlayamıyorum, ancak tamamen alternatif bir yaklaşım önerebiliyorum. Grails kadar grailsApplication.config onun değerlerini alır PropertyPlaceholderConfigurer setleri, böylece sınıfının bir

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

beyan ve sonra fasulye kullanıyorsanız bu da resources.groovy çalışır

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

söyleyebiliriz DSL, ancak çift yerine tek tırnak kullanmayı unutmayın gerekir:

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

"${jdbc.driver}"'u kullanma, Groovy tarafından bir GString olarak yorumlandığı ve resources.groovy işlenirken çözüldüğü için işe yaramadığı için işe yaramıyor, oysa gereksinim duyduğunuz şey, yer tutucu tarafından daha sonra çözülecek özellik değeri olarak bir ${...} ifadesi koymaktır. configurer. ,

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

Ardından:

3

Sadece benim varolan kodun bazı kontrol ettim this method described by Burt Beckwith

yeni bir dosya oluşturun kullanın: içerecek şekilde düzenlemek, Sonra 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.groovysrc/java veya src/groovy içindeki dosyalarınızda şu numarayı arayabilirsiniz:

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

Kayıt olmak için, Grails 2.x'te, bu onaylanmamış tutucunun yerini alan bir Holders class var. Statik bir bağlamda grailsApplication'a erişmek için bunu kullanabilirsiniz.

+0

Bu çözüm Burt [ApplicationContextHolder] (http://burtbeckwith.com/blog/?p=1017) yerine bu çözümden en fazlasını sunduğundan, ayrıca statik atama sorununu ele aldığından görünüyor. – raffian