Grails : JNDI Werte im Embedded Tomcat setzen

von Peter Soth

JNDI eignet sich sehr gut, um einer Web-Applikation von außen (über den Tomcat) Parameter zur Verfügung zu stellen. Die JNDI Einstellungen werden in Tomcat in der context.xml vorgenommen. Entwickelt man in Grails (beispielsweise mit IntelliJ), so läuft der Tomcat jedoch im Embedded Mode. Dies bedeutet, dass keine context.xml vorhanden ist, die editierbar wäre. In den folgenden Code-Beispielen möchte ich zeigen, wie ein JNDI Wert ausgelesen und im Embedded Tomcat gesetzt werden kann. Dies ist beispielsweise zum Testen sehr nützlich.

So würde das Setzen eines JNDI Parameters in der Context.xml (auf dem Produktionsserver) aussehen:

<context>
  ...
  <environment name="jnditest'" override="true" type="java.lang.String" value="Grails JNDI Test String">
  ...
  </environment>
</context>

In der Grails Test-Umgebung werden dann in der Datei _Events.groovy die JNDI Werte gesetzt. Hier muss beachtet werden, dass MyWebAppName durch den richtigen Namen der Web Applikation ersetzt wird. In dem Beispiel unten ist es nicht nötig, das Grails Tomcat Plugin zu modifizieren, wie es in den Grails Mailing-Listen diskutiert wurde:

eventConfigureTomcat = {tomcat ->
    println "### Start Tomcat configuration"

    try {
        def environment = tomcat.class.classLoader.loadClass('org.apache.catalina.deploy.ContextEnvironment').newInstance()
    
        environment.name = 'jnditest'
        environment.type = 'java.lang.String'
        environment.value = 'Grails JNDI Test String'
        environment.override = Boolean.TRUE
    
        def context = tomcat.host.findChild('/MyWebAppName')
        context.namingResources.addEnvironment environment
    }
    catch (Exception e)
    {
        e.printStackTrace()
    }
    println "### End Tomcat configuration"
}

Auslesen in der resources.groovy. So funktioniert es sowohl in der Test- als auch in der Produktions-Umgebung. In dem Beispiel unten wird jedoch überprüft, ob Grails im Entwicklungsmodus läuft:

import org.springframework.web.servlet.i18n.SessionLocaleResolver

// Place your Spring DSL code here
beans = {
    localeResolver(SessionLocaleResolver) {       
        Locale.setDefault(Locale.GERMAN)
    }
    
    if (grails.util.GrailsUtil.environment.equals('development')) {
        jnditest(org.springframework.jndi.JndiObjectFactoryBean) {
            jndiName = 'java:/comp/env/jnditest'
        }
    }
}

Kategorien: Grails

Zurück