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 静态规则似乎无法正常工作

JSF/Grails 应用的静态分析工具

如何在 Grails 中模拟域对象的静态方法?

如何使用 Grails Asset 插件引用静态 HTML rsource?

声纳的 Groovy/Grails 插件

在 Grails 中,如何访问域类静态方法中的休眠会话?