grails服务中cxf bean/客户端的依赖注入不会';不起作用-可能是因为它';在我的plugins config.groovy中配置了什么?
我正在为grails框架开发一个支付插件。我正在使用一个支付提供商,它为我提供了一个SOAP API(WSDL),我需要一个cxf客户机来与Web服务通信 我在grails插件项目(2.2)中安装了(cxf客户端插件),并希望在grails服务中使用我添加到config.groovy中的cxf客户端 在服务类中,我刚刚添加了grails服务中cxf bean/客户端的依赖注入不会';不起作用-可能是因为它';在我的plugins config.groovy中配置了什么?,grails,groovy,cxf,grails-plugin,grails-2.0,Grails,Groovy,Cxf,Grails Plugin,Grails 2.0,我正在为grails框架开发一个支付插件。我正在使用一个支付提供商,它为我提供了一个SOAP API(WSDL),我需要一个cxf客户机来与Web服务通信 我在grails插件项目(2.2)中安装了(cxf客户端插件),并希望在grails服务中使用我添加到config.groovy中的cxf客户端 在服务类中,我刚刚添加了 RecurringPortType recurringPaymentClient 我没有直接启动插件项目,而是将其包含在我的main项目中,在那里我使用了插件服务的一些方
RecurringPortType recurringPaymentClient
我没有直接启动插件项目,而是将其包含在我的main项目中,在那里我使用了插件服务的一些方法(也自动连接到我的main项目中)
在使用autowired插件服务(可以正常工作)之后,我使用在插件服务类中使用autowired cxf客户端的方法得到了一个nullpointer异常。cxf客户端bean ReucClingPaymentClient为空
但是为什么呢?我是否必须将cxf客户端配置也包括在mainprojects config.groovy中?或者有没有一个解决方案可以让我的mainproject合并,或者也可以使用我新插件的config.groovy?此时,cxf配置被放在plugins config.groovy中-也许这就是问题所在
使用
正如cxf客户机文档中所述,没有任何帮助。插件中的
Config.groovy
文件仅在插件本身作为独立应用程序运行时适用。当插件在另一个应用程序中使用时,它不会被读取。我见过一些插件使用的一个技巧(我为自己的一个插件偷了这个技巧)是操纵插件描述符的doWithSpring
中的配置,这通常足够早,可以达到所需的效果。在您的情况下,您必须在cxf客户端
之前加载插件cxf客户端
插件,以确保doWithSpring
(创建配置)发生在cxf客户端
(将使用设置)之前
或者您可以手动使用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
样式的脚本,并将该配置的cxf
部分合并到主应用程序配置的cxf
部分,应用程序中的设置将覆盖插件提供的默认设置。如果用户需要另一个cxf客户端实例用于其项目中的其他用途,该怎么办?在这种情况下,ConfigSlurper会更好,因为它会合并,对吗?@whitenexx这两种情况都会合并-分配给application.config.cxf.client.recurringPaymentClient
不会影响任何其他cxf.client.somethingElse
设置。但这意味着插件会覆盖应用程序中的显式设置,用于recurringPaymentClient
,这与ConfigSlurper方法相反。我认为一种混合方法是创建一个新的ConfigObject()
,直接在那里设置插件设置,然后使用app config将其合并,就像我使用slurper方法一样。
class MyCleverGrailsPlugin {
def version = "0.1-SNAPSHOT"
def loadBefore = ['cxfClient']
def doWithSpring = {
application.config.cxf.client.recurringPaymentClient.clientInterface = com.example.MyClientPortType
// etc. etc.
}
}
def doWithSpring = {
ConfigObject pluginConf = new ConfigSlurper(Environment.current.name).parse(com.example.MyPluginDefaultConfig)
application.config.cxf = pluginConf.cxf.merge(application.config.cxf)
}