在域对象和静态范围中获取grails 2.0.0M1配置信息?
如何从域对象或静态范围获取Config.groovy信息?我现在使用的是ConfigurationHolder.config.*但是它和ApplicationHolder都不推荐使用,所以我想“正确使用”。。。但是grailsApplication对象在DO/静态范围内不可用。我想将在域对象和静态范围中获取grails 2.0.0M1配置信息?,grails,grails-domain-class,Grails,Grails Domain Class,如何从域对象或静态范围获取Config.groovy信息?我现在使用的是ConfigurationHolder.config.*但是它和ApplicationHolder都不推荐使用,所以我想“正确使用”。。。但是grailsApplication对象在DO/静态范围内不可用。我想将grailsApplication添加到域类的元类中——这是我考虑为2.0 final做的事情。现在,把它放在BootStrap.groovy中 class BootStrap { def grailsApp
grailsApplication
添加到域类的元类中——这是我考虑为2.0 final做的事情。现在,把它放在BootStrap.groovy中
class BootStrap {
def grailsApplication
def init = { servletContext ->
for (dc in grailsApplication.domainClasses) {
dc.clazz.metaClass.getGrailsApplication = { -> grailsApplication }
dc.clazz.metaClass.static.getGrailsApplication = { -> grailsApplication }
}
}
}
然后,您可以通过
grailsApplication.config
访问配置,通过grailsApplication.mainContext.getBean('foo')
或只通过grailsApplication.mainContext.foo
访问Springbeans,我真的只想在静态实用程序中访问配置。在搜索和阅读了SO的大部分答案后,我得出了一个简单的解决方案(可能对某些人有用):
在src/groovy下添加holder类:
class StaticContext {
static def app;
}
在引导初始化中初始化它
class BootStrap {
def grailsApplication
def init = { servletContext ->
StaticContext.app = grailsApplication
}
def destroy = {
}
}
并在静态实用程序中访问它:
//In my case Solr URL in single ton
def solrUrl = StaticContext.app.config.solr.url
Grails 2取代了不推荐使用的
ApplicationHolder
、ConfigurationHolder
等,它提供了相同的功能,但在同一容器中的多个不同WebApp在父类加载器中共享Grails JAR的单个副本时是安全的(这是旧持有人破产的情况)
在Grails2.2.5中,我发现这是可行的:
grails app/conf/Config.groovy
中配置您的变量。例如:
environments {
...
development {
...
grails.config.myUrl = "http://localhost:3000"
...
import grails.util.Holders
class myClass {
...
def static myStaticMethod() {
def myVar = Holders.config.grails.config.myUrl
...
好主意…但是,启动失败的原因是“起因:org.hibernate.InstantiationException:无法实例化TestObjectQdcore.UserCallFlow”(qdcore.UserCallFlow是一个域类),因为hibernate似乎在引导运行之前做了一些事情。为了避免这个问题,我使用了安全的deref(例如,grailsApplication?.config?.qdcore?.servers?.upload?.url),这样Hibernate就可以运行引导程序,然后grailsApplication就可以使用了。谢谢!但是,即使在DO中有安全的deref(def grailsApplication;def config=grailsApplication?.config;def String usrv=config?.qdcore?.servers?.upload?.url)我得到的是空值,所以我还没有正确地使用它——我会在整理好自己后再发回来;)工作原理是使用grailsApplication的静态范围,其余的使用实例范围;例如,类UCF{static grailsApplication;def config=grailsApplication?.config;def String usrv=config?.qdcore?.servers?.upload?.url…}我不能将静态作用域用于其他应用程序,因为我得到了“grailsApplication”的异常当我试图获取它的config属性时,它为null。这可能有点令人不安,但它适用于这个原型应用程序!Burt,请在Grails 2.0的DCs中包含grailApplication,这将是一个方便、简洁和有用的方法addition@BurtBeckwith,是Ian Roberts提到的
grails.util.Holders
方法,它是实现他的?这在quartz计划作业的静态触发器块中特别有用。谢谢!这也适用于域中的hibernate映射,以便从外部属性文件配置内容。谢谢。
import grails.util.Holders
class myClass {
...
def static myStaticMethod() {
def myVar = Holders.config.grails.config.myUrl
...