2012-10-31 6 views
6

Po uruchomieniu aplikacji Grails uruchamiam również proces wiosennej integracji i przetwarzania wsadowego w tle. Chcę mieć niektóre właściwości połączenia DB przechowywane w pliku Config.groovy, ale w jaki sposób uzyskać do nich dostęp z klasy Java używane w procesie integracji/Batch?Dostęp do Config.groovy z klasy Java

Znalazłem ten wątek:

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

co sugeruje, używając:

private Map config = ConfigurationHolder.getFlatConfig(); 

następuje coś w rodzaju:

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

to faktycznie działa w porządku (teh właściwości są ładowane poprawnie z Config.groovy), ale problemem jest t hat ConfigurationHolder jest przestarzały. A każdy wątek Znalazłem czynienia z problemem wydaje się być specyficzne i Grails sugerują stosując wstrzykiwanie zależności, jak w tym wątku:

How to access Grails configuration in Grails 2.0?

Więc jest tam zakaz przestarzałe sposób, aby uzyskać dostęp do Config.groovy właściwości z pliku klasy Java?

+0

Co jest nie tak z drugą metodą z [zaakceptowanej odpowiedzi na pytanie, z którym łączyłeś się] (http://stackoverflow.com/a/7136095/6509)? –

+0

Cześć Tim, okrzyki za odpowiedź. Wrzuciłem moją klasę java jako komponent bean w pliku zasobów (z właściwością grailsApplication i ref of grailsApplication) i dodałem do mojej klasy następujący wiersz: private GrailsApplication grailsApplication; z geterem i seterem. Ale kiedy próbuję uzyskać do niego dostęp za pomocą ConfigObject config = grailsApplication.getConfig(); wydaje się mieć wartość zerową i błędy. Jakieś pomysły, co robię źle? Dzięki – Illu

+0

Gdzie próbujesz uzyskać do niego dostęp? W konstruktorze nie można używać ziaren zależnych od zależności, na przykład trzeba zadeklarować metodę opisaną za pomocą '@ PostConstruct' i umieścić logikę, która wymaga zamiast niej' grailsApplication' lub alternatywnie użyć zamiast tego argumentu do wstawiania argumentów konstruktora Setter injection. –

Odpowiedz

1

Nie mogę zrozumieć, dlaczego to nie działa, ale mogę zaproponować całkowicie alternatywne podejście. Grails konfiguruje PropertyPlaceholderConfigurer że przybiera wartości od grailsApplication.config, więc można zadeklarować

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

na swojej klasie, a potem mówią

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

Działa to również w resources.groovy jeśli używasz fasolę DSL, ale trzeba pamiętać, aby używać apostrofów zamiast podwójnie:

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

Używanie "${jdbc.driver}" nie działa, ponieważ jest interpretowane przez Groovy jako GString i (nie może być) rozwiązane, gdy przetwarzane jest resources.groovy, podczas gdy to, czego potrzebujesz, to umieszczenie dosłownego wyrażenia w postaci wartości właściwości, która ma być później rozstrzygnięta przez element zastępczy configurer.

3

Tylko sprawdzone w niektórych z mojego istniejącego kodu i używam this method described by Burt Beckwith

Utwórz nowy plik: 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() 
    } 
} 

Następnie edytować grails-app/config/spring/resources.groovy obejmuje:

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

Następnie w plikach wewnątrz src/java lub src/groovy można zadzwonić pod numer:

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

Aby zarejestrować się w Grails 2.x, istnieje Holders class, który zastępuje ten przestarzały uchwyt. Możesz użyć tego, aby uzyskać dostęp do grailsApplication w statycznym kontekście.

+0

Wydaje się, że zastępuje on [ApplicationContextHolder] Burta (http://burtbeckwith.com/blog/?p=1017), ponieważ oferuje on najwięcej z tego rozwiązania, a także rozwiązuje problem statycznego przydziału. – raffian