gpt4 book ai didi

Grails 覆盖插件服务静态方法

转载 作者:行者123 更新时间:2023-12-02 14:51:39 26 4
gpt4 key购买 nike

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

 package grails.plugins.imports

class ImportsService {
static rabbitQueue = "${grails.util.Holders.grailsApplication.metadata['app.name']}ImportRows"
....
}

虽然这在使用 run-app 时效果很好;即 grails run-app,这在尝试作为 war 运行时会造成严重破坏; chalice 运行 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)

没有 fork 插件,这里有什么建议吗?

chalice 2.3.10

提前致谢,
托德

最佳答案

所以,我知道你的目标是避免 fork 插件,但我认为问题在于插件是在早期编写的,当时你可以通过持有者类获取 grailsApplication 对象。这些天不是很推荐(见 Burt Beckwith's post on the subject ),但是有 options .

插件获取 grailsApplication 对象的最简单方法是通过依赖注入(inject):

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 通过在项目浏览器 View 中提供插件使这变得相当容易。如果该更改有效,并且您可以向插件开发人员提交补丁,您也许可以让修复成为正式版本的一部分。

关于Grails 覆盖插件服务静态方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25753478/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com