2011-08-08 12 views

Respuesta

8

Agregaría el grailsApplication a la metaclase de clases de dominio; esto es algo que estoy pensando hacer para 2.0 final. Por ahora, colóquelo en BootStrap.groovy, p.

class BootStrap { 

    def grailsApplication 

    def init = { servletContext -> 
     for (dc in grailsApplication.domainClasses) { 
     dc.clazz.metaClass.getGrailsApplication = { -> grailsApplication } 
     dc.clazz.metaClass.static.getGrailsApplication = { -> grailsApplication } 
     }  
    } 
} 

A continuación, puede acceder a la configuración de grailsApplication.config, y la primavera a través de los granos de grailsApplication.mainContext.getBean('foo') o simplemente grailsApplication.mainContext.foo.

+0

Buena idea ... pero, el arranque falla con "Causado por: org.hibernate.InstantiationException: no se pudo instanciar la prueba objectqdcore.UserCallFlow "(qdcore.UserCallFlow es una clase de dominio), ya que parece que Hibernate está haciendo algo antes de que se ejecute Bootstrap. Para evitarlo, utilizo deref seguro (por ejemplo, grailsApplication? .config? .qdcore? .servers? .upload? .url) para que Hibernate esté contento, Bootstrap se ejecute y grailsApplication está disponible. ¡Gracias! – Wayne

+0

Pero, incluso con deref seguro en el DO (def grailsApplication; def config = grailsApplication? .config; def String usrv = config? .qdcore? .servers? .upload? .url) Estoy obteniendo valores nulos, entonces I ' No lo estoy usando bien, aún bastante. Volveré a publicar cuando me solucione;) – Wayne

+0

Lo que funciona en el DO es usar el alcance estático para la aplicación Grails y el alcance de la instancia para el resto; por ejemplo, clase UCF {static grailsApplication; def config = grailsApplication? .config; def String usrv = config? .qdcore? .servers? .upload? .url ...} No puedo usar el ámbito estático para los demás, ya que entonces tengo excepciones de que "grailsApplication" es nulo cuando intento obtener su propiedad de configuración. Esto es un poco nervioso, tal vez, ¡pero funciona para esta aplicación de creación de prototipos! – Wayne

1

Realmente quería acceder a config en utilidades estáticas solamente. Después de buscar y leer la mayoría de las respuestas en tanto, me encontré con una solución sencilla (Puede ser útil para alguien): Clase

Agregar titular bajo src/maravilloso:

class StaticContext { 
    static def app; 
} 

inicializarlo en init arranque

class BootStrap { 

    def grailsApplication 

    def init = { servletContext -> 
     StaticContext.app = grailsApplication 
    } 

    def destroy = { 
    } 
} 

y acceder a ella en utilidades estáticas:

//In my case Solr URL in single ton 
def solrUrl = StaticContext.app.config.solr.url 
19

El Grails 2 repla cemento para el ApplicationHolder obsoleto, ConfigurationHolder, etc. es grails.util.Holders, que proporciona la misma funcionalidad pero de una manera que es segura cuando varias aplicaciones diferentes en el mismo contenedor comparten una única copia de los archivos JAR de Grails en un cargador de clases principal (este es el caso donde los titulares antiguos se rompieron).

import grails.util.Holders 

// ... 

static void foo() { 
    def configOption = Holders.config.myapp.option 
} 
+0

Esto fue particularmente útil en el bloque de activadores estáticos de trabajos programados de cuarzo. ¡Gracias! – Gary

+0

Esto también está funcionando en las asignaciones de hibernación en el dominio para tener cosas configurables desde el archivo de propiedades externo. Gracias. – Eduard

1

En Grails 2.2.5 He encontrado que esto funcionaría:

  1. Configure la variable de grails-app/conf/Config.groovy, en la sección apropiada para su entorno. Por ejemplo:

    environments { 
    ... 
        development { 
        ... 
        grails.config.myUrl = "http://localhost:3000" 
        ... 
    

    ...

  2. Para acceder:

    import grails.util.Holders 
    
    class myClass { 
    ... 
    
        def static myStaticMethod() { 
         def myVar = Holders.config.grails.config.myUrl 
    ... 
    
Cuestiones relacionadas