绑定在现有项目中的新SOAP请求失败

时间:2012-04-06 14:40:03

标签: grails soap binding wsdl cxf

我已经向已经使用了大量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)。

编辑:匿名化我打算匿名的一些东西。

3 个答案:

答案 0 :(得分:7)

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

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

答案 1 :(得分:3)

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

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

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

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

答案 2 :(得分:0)

您是否使用参数名称&#34;在&#34; ?

中的

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

尝试重命名参数。