grails服务中cxf bean/客户端的依赖注入不会';不起作用-可能是因为它';在我的plugins config.groovy中配置了什么?

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项目中,在那里我使用了插件服务的一些方

我正在为grails框架开发一个支付插件。我正在使用一个支付提供商,它为我提供了一个SOAP API(WSDL),我需要一个cxf客户机来与Web服务通信

我在grails插件项目(2.2)中安装了(cxf客户端插件),并希望在grails服务中使用我添加到config.groovy中的cxf客户端

在服务类中,我刚刚添加了

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)
}