我有一个应用程序和一个用Grails 2.1.1构建的插件,我升级到2.2.1,我遇到了一个奇怪的问题。我的应用程序开始爆炸,因为我的应用程序中定义的配置值突然Config.groovy
groovy.Util.ConfigObject
而不是它们的实际值。这是问题的第 1 部分,第 2 部分是在我的应用程序中,我在应用程序的Config.groovy
中定义
grails.config.defaults.locations = [
"classpath:DemoPluginConfig.groovy",
]
DemoPluginConfig.groovy
包含此属性
oo.memcached.timeout=400000
并且DemoPluginConfig.groovy
文件在我的演示插件的src/java
文件夹中。我有一个 memcache 服务,一旦服务准备就绪,我就会尝试设置该超时属性:
def void afterPropertiesSet() {
ConnectionFactoryBuilder cfb = new ConnectionFactoryBuilder()
def config = grailsApplication.config;
def operationTimeOut = config.oo.memcached.timeout
cfb.setOpTimeout(timeOut)
}
Grails run-app 在这一点上爆炸并出现错误:
Caused by MissingMethodException: No signature of method: net.spy.memcached.ConnectionFactoryBuilder.setOpTimeout() is applicable for argument types: (groovy.util.ConfigObject) values: [[:]]
Possible solutions: setOpTimeout(long)
->> 55 | unwrap in org.codehaus.groovy.runtime.ScriptBytecodeAdapter
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
| 46 | call in org.codehaus.groovy.runtime.callsite.PojoMetaClassSite
| 45 | defaultCall . . . . . . . . . . in org.codehaus.groovy.runtime.callsite.CallSiteArray
| 108 | call in org.codehaus.groovy.runtime.callsite.AbstractCallSite
| 116 | call . . . . . . . . . . . . . in ''
| 20 | afterPropertiesSet in com.millennialmedia.ui.core.MemcachedService
| 1514 | invokeInitMethods . . . . . . . in org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory
| 1452 | initializeBean in ''
| 519 | doCreateBean . . . . . . . . . in ''
| 122 | doCreateBean in org.codehaus.groovy.grails.commons.spring.ReloadAwareAutowireCapableBeanFactory
| 456 | createBean . . . . . . . . . . in org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory
| 271 | resolveInnerBean in org.springframework.beans.factory.support.BeanDefinitionValueResolver
| 126 | resolveValueIfNecessary . . . . in ''
| 1360 | applyPropertyValues in org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory
| 1118 | populateBean . . . . . . . . . in ''
如果我尝试再运行几次 grails run-app,它会成功启动,但应用程序在加载带有另一个groovy.Util.ConfigObject
的页面时爆炸,这是不可序列化的错误。在应用程序崩溃之前逐步调试表明,当我们到达setOptTimeOut
行时,grailsApplication.config
只包含来自我的应用程序的 Config.groovy 的配置选项,就好像插件DemoPLuginConfig.groovy
中的值被忽略了一样。
恢复到 2.1.1 会使一切恢复正常。在这一点上,我不知道该去哪里看。
你不应该使用operationTimeOut
而不是下面的timeOut
cfb.setOpTimeout(timeOut)
尝试将Groovy配置放在grails-app/conf中,而不是src/java中。然后,查看是否可以一致地重现错误。
如果一切都失败了,圣杯清洁可能会占上风。
希望对你有帮助