Grails覆盖插件服务静态方法

时间:2014-09-09 20:59:52

标签: grails

我正在使用具有此服务的插件:

 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] ERROR StackTrace - 全栈跟踪:

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

提前致谢, 托德

1 个答案:

答案 0 :(得分:0)

所以,我知道你的目标是避免分支插件,但我认为问题在于插件是在早些时候编写的,当你通过holder类获取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使这一点变得相当容易。如果该更改有效,并且您可以向插件开发人员提交补丁,则可以将该修补程序作为正式版本的一部分。