即使正确发送SOAP请求,Axis2也始终接收空参数?

更新:我现在已经解决了这个问题 – 请滚动到底部以获取有关修复的信息

嗨,大家好,

我有一个用Java编写的Web服务,托管在Axis2 / Tomcat / Apache服务器上。 我的客户端软件是用C#编写的。

我对java2wsdl生成wsdl文件的方式有一些恼人的问题,这确实让我在早期遇到了一些麻烦,但是有了这个问题我完全被难倒了。

基本上发生的事情是客户端看到Web服务正常,并发送一个完全有效(或至少,它看起来对我来说有效)带有参数的SOAP请求。

在服务器上,执行正确的Web方法,但参数都为null。 我的Web服务会检测到这一点,并建立一个响应,客户端可以很好地接收和理解。

我的预感是,Axis2在某个地方的表面不尽如人意,但考虑到我对java2wsdl的头痛,也许我需要的只是改变我的wsdl文件。

这是wsdl文件:

                                                                                                                                                  

这是一个示例请求和响应:

请求:

     123456-654321    

响应

      -101 ERROR: Empty Serial     

有没有人知道会出现什么问题?

响应中的错误消息只能在请求中的serialcode参数为空/ null时发送,因此我猜测Axis2读取参数的方式有问题。

任何帮助深表感谢。

================================================== ==========

如何修复此问题:

这是对Aldo要求提供有关我如何解决此问题的更多信息的回应。

我不确定为什么这个修复工作 – 也许它只是Axis2中的一个错误或其他东西。 无论哪种方式,YMMV,因为我不知道问题是由我的设置或其他原因引起的。 我只能说,通过做到以下几点,一切都开始奏效了。

无论如何,自动生成的WSDL文件为Web请求及其参数创建复杂元素类型,即使唯一的参数是简单类型(如字符串或整数)也是如此。 我所做的是遍历并为参数创建正确的简单类型标记(例如’serialcode’或’date-string’),然后使用对简单类型的引用替换对WSDL文件中其他位置的复杂类型的引用。

一个例子如下:

自动生成的WSDL方法和参数

                       

基本上你应该做的是丢弃自动生成的参数并创建简单类型。 然后,您可以修改“请求”标记以使用“类型”而不是“元素”,并使用新创建的简单类型。

修改/固定WSDL

            

显然,这取决于你的参数究竟是什么。 在我的例子中,它们都是标准的简单类型,如字符串和整数。 如果您传递的是多个参数,则可能需要保留自动生成的元素,但要确保元素引用简单类型,而不是仅仅将type属性包含为’xs:string’或类似的东西。

道歉我不能更清楚这一点,但正如我之前所说 – 我不知道为什么会这样。

最后一件事:通过删除请求标记中的’element’引用属性 – 您可能会在Axis2日志中收到解析器警告。 到目前为止,这并没有给我带来任何问题,但如果遇到麻烦,需要注意一些问题。

我通过浏览我的WSDL文件解决了这个问题,并尽可能将元素分解为简单类型的对应物并相应地更新XML元素之间的引用。

我不确定为什么会这样,但无论如何它已经解决了我的问题。

如果你有一个复杂的属性,这就是你可以做到的

之前

            

          

然后改变这个

    

    

那应该是它! 它为我做了….

这只是一种预感,但也许你有一个命名空间问题。 如果您专注于wsdl的这一部分,请注意您的参数具有元素的“ns0”命名空间,但在稍后定义的操作中,看起来您正在使用“axis2”命名空间。 使用我的所有Axis2生成的WSDL,这两个名称空间是相同的。

                       

您可以检查的另一件事是validation您从java2wsdl获得的wsdl与axis2生成的wsdl相同。 除非您在services.xml中更改了“useoriginalwsdl”的默认设置,否则这些wsdls可能会“看起来”不同。 我从来没有必须手动执行java2wsdl以使我的web服务正常运行…

所以基本上,在浏览器中点击你的服务URL并在url的末尾添加?wsdl …你应该得到一个wsdl用于比较。

此外,让您的客户端从服务器的wsdl生成存根,而不是由java2wsdl生成的存根(假设您最初使用的是来自java2wsdl的wsdl)。 同样,我们永远不必将手动生成的wsdl传递给任何人……他们只是简单地从服务器中消耗了动态生成的wsdl …

你试过发这样的请求吗?

      123456-654321     

我的所有请求都在实际请求参数之前有请求标记。

试试这个:123456-654321

将xmlns =“”放入参数标记中。 我有同样的问题,我不知道我可以修改什么,以便接收参数whitout xmlnx。

我有另一种解决方法。 我最终发现,如果我不让我的IDE(Netbeans 6.8)生成WSDL,那么Web服务就可以了。 或者,如果我删除它,取消选中generate选项并重新部署然后它就可以了。

将Netbeans生成的WSDL与生成的服务器进行比较,我注意到以下差异:

  • 的xmlns:NS0 = “HTTP:/// XSD”
  • wsdl:definitions标记末尾的目标命名空间有一个尾部斜杠
  • ns0用于选择组成wsdl:message标记的元素

删除所有这些并重新部署工作!