Grails 覆盖插件服务静态方法
Posted
技术标签:
【中文标题】Grails 覆盖插件服务静态方法【英文标题】:Grails override a plugin service static method 【发布时间】:2014-11-03 09:32:26 【问题描述】:我正在使用具有此服务的插件:
package grails.plugins.imports
class ImportsService
static rabbitQueue = "$grails.util.Holders.grailsApplication.metadata['app.name']ImportRows"
....
虽然这在使用 run-app 时可以正常工作;即 grails run-app,这在尝试作为战争运行时会造成严重破坏; grails run-war。
2014-09-09 15:54:25,069 [localhost-startStop-1] 错误堆栈跟踪 - 完整堆栈跟踪:
java.lang.NullPointerException: Cannot get property 'metadata' on null object
at org.codehaus.groovy.runtime.NullObject.getProperty(NullObject.java:56)
at org.codehaus.groovy.runtime.InvokerHelper.getProperty(InvokerHelper.java:169)
at org.codehaus.groovy.runtime.callsite.NullCallSite.getProperty(NullCallSite.java:44)
at org.codehaus.groovy.runtime.callsite.AbstractCallSite.callGetProperty(AbstractCallSite.java:227)
at grails.plugins.imports.ImportsService.<clinit>(ImportsService.groovy:9)
没有分叉插件,这里有什么建议吗?
Grails 2.3.10
提前致谢, 托德
【问题讨论】:
我认为您或插件可能会在不正确的environment
中定义metadata
(例如在development
中)。请检查配置。
检查配置是为了什么?抱歉,我没有关注
啊,我明白了。起初我以为 Grails 找不到metadata
。但是grailsApplication
有问题。我对此没有任何想法。
【参考方案1】:
所以,我知道您的目标是避免分叉插件,但我认为问题在于插件是在早期编写的,当时您可以通过持有者类获取 grailsApplication 对象。现在不推荐这样做(参见Burt Beckwith's post on the subject),但有options。
插件获取 grailsApplication 对象的最简单方法是通过依赖注入:
class ImportsService
def grailsApplication
static rabbitQueue = "$grailsApplication.metadata['app.name']ImportRows"
//....
虽然在这种情况下,由于您只需要 app.name,因此最好:
class ImportsService
static rabbitQueue = "$grails.util.Metadata.current.'app.name'ImportRows"
//....
您可以尝试在本地副本中操作插件代码,看看是否能解决问题。 GGTS 通过在项目浏览器视图中提供插件使这变得相当容易。如果该更改有效,并且您可以向插件开发人员提交补丁,您也许可以让修复成为正式版本的一部分。
【讨论】:
是的,我分叉了。谢谢以上是关于Grails 覆盖插件服务静态方法的主要内容,如果未能解决你的问题,请参考以下文章
休息资源的 Grails spring-security 静态规则似乎无法正常工作