2012-10-31 24 views
6

Quando si avvia l'applicazione Grails, avvio anche un processo di integrazione e batch di Spring in background. Voglio avere alcune proprietà di connessione DB memorizzate nel file Config.groovy, ma come posso accedervi da una classe Java utilizzata nel processo di integrazione/batch?Accesso a Config.groovy dalla classe Java

ho trovato questa discussione:

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

che suggerisce usando:

private Map config = ConfigurationHolder.getFlatConfig(); 

seguita da qualcosa come:

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

Questo funziona davvero bene (teh proprietà sono caricati correttamente da Config.groovy) ma il problema è t hat ConfigurationHolder è dopo essere stato deprecato. E qualsiasi discussione che ho trovato che fare con la questione sembra essere specifiche-Grails e suggerire utilizzando dependency injection, come in questa discussione:

How to access Grails configuration in Grails 2.0?

Così, c'è un modo non deprecato per ottenere l'accesso al Proprietà di Config.groovy da un file di classe Java?

+0

Cosa c'è che non va nel secondo metodo nella [risposta accettata della domanda che hai collegato] (http://stackoverflow.com/a/7136095/6509)? –

+0

Ciao Tim, evviva per aver risposto. Ho inserito la mia classe java come bean nel file delle risorse (con una proprietà di grailsApplication e un ref di grailsApplication) e ho aggiunto la seguente riga alla mia classe: private GrailsApplication grailsApplication; con getter e setter. Ma quando provo ad accedervi tramite ConfigObject config = grailsApplication.getConfig(); sembra essere nullo ed errori. Qualche idea su cosa sto facendo male? Grazie – Illu

+0

Dove stai cercando di accedervi? Non è possibile utilizzare bean con aggiunta di dipendenza nel costruttore, ad esempio, è necessario dichiarare un metodo annotato con '@ PostConstruct' e inserire la logica che richiede' grailsApplication 'al suo posto, oppure utilizzare in alternativa l'argomento argomento del costruttore piuttosto che iniezione setter. –

risposta

1

Non riesco a capire perché questo non funziona, ma posso suggerire un approccio alternativo del tutto. Grails imposta una PropertyPlaceholderConfigurer che prende i propri valori dalla grailsApplication.config, quindi si può dichiarare una

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

sulla tua classe e poi dire

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

Questo funziona anche in resources.groovy se si sta utilizzando i fagioli DSL, ma si deve ricordare di utilizzare virgolette singole piuttosto che doppia:

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

L'utilizzo di "${jdbc.driver}" non funziona perché viene interpretato da Groovy come GString e (non riesce) risolto quando viene elaborato resources.groovy, mentre è necessario inserire un'espressione letterale come valore della proprietà da risolvere in seguito dal segnaposto configurer.

3

appena controllato in alcuni dei miei codice esistente, e io uso this method described by Burt Beckwith

Creare un nuovo file: 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() 
    } 
} 

Poi, modificare grails-app/config/spring/resources.groovy per includere:

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

Poi, nei file all'interno di o src/groovy, è possibile chiamare:

4

Solo per registrarsi, in Grails 2.x, c'è uno Holders class che sostituisce questo titolare deprecato. È possibile utilizzarlo per accedere a grailsApplication in un contesto statico.

+0

Questo sembra sostituire Burt [ApplicationContextHolder] (http://burtbeckwith.com/blog/?p=1017) poiché offre la maggior parte da quella soluzione, anche per risolvere il problema di assegnazione statica. – raffian

Problemi correlati