我正在为grails框架开发一个支付插件。我使用的是一个支付提供商,它给了我一个SOAP API (WSDL),我需要一个cxf-client来与the服务通信。
我在grails插件项目(2.2)中安装了https://github.com/ctoestreich/cxf-client (cxf-client plugin),并希望在grails服务中使用我添加到config.groovy中的cxf-client。
在我刚刚添加的Service Class中
RecurringPortType recurringPaymentClient我没有直接启动插件项目,而是将它包含在我的主项目中,在主项目中我使用了插件服务的一些方法(也自动连接到我的主项目中)。
在使用自动连接的插件服务(可以工作)之后,我在插件服务类中使用了自动连接的cxf-client方法,得到了一个空指针异常。cxf-client bean reuccringPaymentClient为空。
但是为什么呢?我是否必须将cxf-client配置也包含到我的主项目config.groovy中?或者有没有一个解决方案,我的主项目可以合并,或者也可以使用我的新插件的config.groovy?此时,cxf- config.groovy被放在插件配置中--也许这就是问题所在?
使用
RecurringPortType recurringPaymentClient = ApplicationHolder.application.mainContext.getBean("recurringPaymentClient")正如cxf-client文档中所述,它没有帮助。
发布于 2013-03-12 19:41:59
插件中的Config.groovy文件仅在插件本身作为独立应用程序运行时才适用。当插件在另一个应用程序中使用时,它不会被读取。我见过一些插件使用的一个技巧(我为我自己的一个插件偷来的)是操纵插件描述符的doWithSpring中的配置,这通常足够早来达到所需的效果。在您的情况下,您必须使您的插件loadBefore cxf-client插件,以确保您的doWithSpring (创建配置)发生在cxf-client (将使用设置的地方)之前。
class MyCleverGrailsPlugin {
def version = "0.1-SNAPSHOT"
def loadBefore = ['cxfClient']
def doWithSpring = {
application.config.cxf.client.recurringPaymentClient.clientInterface = com.example.MyClientPortType
// etc. etc.
}
}或者,您可以手动使用ConfigSlurper
def doWithSpring = {
ConfigObject pluginConf = new ConfigSlurper(Environment.current.name).parse(com.example.MyPluginDefaultConfig)
application.config.cxf = pluginConf.cxf.merge(application.config.cxf)
}这将从插件的src/groovy/com/example/MyPluginDefaultConfig.groovy加载Config.groovy-style脚本,并将该配置的cxf部分合并到主应用程序配置的cxf部分,其中应用程序中的设置将覆盖插件提供的默认值。
https://stackoverflow.com/questions/15359140
复制相似问题