即使正确发送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标记的元素
删除所有这些并重新部署工作!