【问题标题】:Binding fails for new SOAP request in existing project现有项目中的新 SOAP 请求绑定失败
【发布时间】:2012-04-06 14:40:03
【问题描述】:

我已向已使用大量 SOAP 请求的现有项目添加了一个新的 SOAP 请求。他们都工作正常。我以完全相同的方式添加新的(通过 Apache CXF 从 WSDL 生成的代码),但不知何故它失败了。

我收到此错误:

javax.xml.ws.WebServiceException: Could not find wsdl:binding operation info for web method foo.
    at org.apache.cxf.jaxws.JaxWsClientProxy.invoke(JaxWsClientProxy.java:113)
    at $Proxy51.foo(Unknown Source)

这是一个Grails项目,代码是这样调用的:

FooRequest request = new FooRequest()
processResponse(order) { getPort().foo(request) }

显然是底部的 getPort().foo() 失败了。 事实上,我相信失败的不是调用,而是闭包的创建,因为 processResponse() 似乎没有被执行(我在该方法的第一行放了一个 println)。 编辑:失败的是闭包的执行,而不是创建。所以它真的找不到 getPort().foo(),尽管我生成的接口确实有这个方法:

public nl.wecompany.portal.webserviceQopi.QOPIResponse foo(
    @WebParam(name = "in", targetNamespace = "")
    com.myproject.FooRequest in
);

getPort() 返回一个 org.apache.cxf.jaxws.JaxWsClientProxy@41079622,它也为其他 SOAP 请求(有效的请求)执行此操作。

我在我的新代码和现有代码之间找不到任何有意义的区别。有什么想法可能是错的吗?有什么建议去哪里看吗?

编辑:port.metaClass.methods*.name.sort().unique() 确实包含我的新 foo() 方法。然而,当我调用它时,我得到了这个奇怪的 wsdl:binding 错误,并且该方法没有被执行(它没有到达第一行的 println)。

编辑:对我打算匿名的一些内容进行匿名处理。

【问题讨论】:

  • 你在使用 cxf 插件吗?代理在类路径中加载的类中找不到正确的方法。
  • 我没有使用任何 Grails CXF 插件。我正在使用 Apache CXF 命令行工具,并将生成的代码粘贴到项目中。据我所知,这在过去一直有效。我使用的是 Apache CXF 1.2.1,因为这是过去使用的版本。
  • port.metaClass.methods*.name.sort().unique() 确实包括我的新 foo() 方法。所以该方法在类层次结构中,但是当它被调用时,我得到了这个奇怪的 wsdl:binding 错误,而不是正在执行的实际方法。
  • 我有点困惑。我不是 Groovy 的王者,但 getPort() 的签名是什么,返回是什么?它应该返回接口,它是什么?以及foo()simSwitch() 有什么关系?
  • foo() 实际上 simswitch。我以为我到处都匿名了,但显然我没有。

标签: grails soap binding wsdl cxf


【解决方案1】:

我想我明白了。 JaxWsClientProxy 可能有一个 foo() 方法,但这不是我的 foo() 方法。它是我的 foo() 方法的代理,它首先检查此方法是否实际存在于远程服务器上的 WSDL 中。如果我没有使用 foo 请求更新远程服务器上的 WSDL,那么它会抛出异常而不是调用我的实际 foo() 方法。我没想到会在看起来像是常规方法调用的中间进行这种检查,但显然这种检查是拥有这样一个 WSDL/SOAP 绑定框架的全部意义所在。

连接到具有更新的 WSDL 的服务器解决了该问题。

【讨论】:

    【解决方案2】:

    这在 jboss EAP 中发生在我身上,问题是在我的框架的 module.xml 中没有添加对 jboss-cxf 的依赖项,并且默认情况下它使用 de jaxws 规范。为了解决这个问题,我添加了以下内容:

    <module name="org.jboss.ws.cxf.jbossws-cxf-client" export="true"/>
    

    export=true 表示包含 cxf 库所需的所有库。

    我希望这可以帮助更多的人。我花了将近一周的时间。

    【讨论】:

    • 我花了一周的时间来解决这个问题,我发现几个类似的问题有同样的问题,但没有解决方案。由于您的回答,我还在 jboss-docs 中找到了一些信息:docs.jboss.org/author/display/AS71/…
    • 谢谢,希望对其他人有所帮助!
    【解决方案3】:

    您是否使用“in”参数名称?

    in 是 groovy 中的保留字。我怀疑这是问题所在。

    尝试重命名您的参数。

    【讨论】:

      猜你喜欢
      • 2014-05-08
      • 1970-01-01
      • 2016-08-15
      • 1970-01-01
      • 1970-01-01
      • 2017-02-18
      • 2019-10-10
      • 2023-03-17
      • 1970-01-01
      相关资源
      最近更新 更多