我有WSDL(我是从外部提供商处获得的)。有这样的行:
<xsd:complexType name="SalesRequest">
<xsd:all>
<xsd:element name="merchantid" type="xsd:int"/>
<xsd:element name="password" type="xsd:string"/>
...
</xsd:all>
</xsd:complexType>
...
<message name="SalesResponse">
<part name="request" type="tns:SalesResponse"/>
</message>
..
<portType name="InterfacePortType">
<operation name="Sales">
<documentation>some text</documentation>
<input message="tns:SalesRequest"/>
<output message="tns:SalesResponse"/>
</operation>
我已经基于这个WSDL生成了Java类(使用JAX-RPC)。
然后我创建了Axis Service(MyService实现了InterfacePortType)。
我准备了XSDD文件,将MyService部署到Web应用程序。
所以,然后我调用MySerive的一个方法,并在服务器端响应序列化时得到此错误:
意外元素名称:expected = request,actual = SalesReturn
这意味着我的XSDL和XSDD并没有那么多。 MyService准备了这样的响应(但不计算通过网络发送):
<?xml version="1.0" encoding="utf-8"?><soapenv:Envelope
...
<SalesReturn href="#id0"/></ns1:SalesResponse><multiRef xmlns:ns2=
...
</soapenv:Envelope>
问题是:我应该如何处理WSDD,以便在服务的响应XML中使用'request'而不是'SalesReturn'?
我不知道这个'返回'后缀来自何处。
- 我已经做过的一些步骤:
我用google搜索,发现WSDL中应该有'schema elementFormDefault =“qualified”'。但我无法更改WSDL,因为它是外部的,它是由外部提供商提供的。
答案 0 :(得分:0)
错误告诉你的是请求应该是
<soapenv:Envelope>
<request>
<SalesRequest>...
你正在发送
<soapenv:Envelope>
<SalesReturn>...
获得这个数字的最佳方法是尝试使用SOAP UI之类的工具,并将它们发送的有效负载与您从工具生成的内容进行比较 - 某些工具可以选择在输入中包装或解包部件名称/输出消息。
希望这会有所帮助
答案 1 :(得分:0)
我找到了解决方案,我使用 axistools-maven-plugin 生成WSDD,将serverSide参数设置为 true - 然后生成WSDD文件。
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>axistools-maven-plugin</artifactId>
<executions>
<execution>
<id>wsdl2java-job</id>
<phase>generate-sources</phase>
<goals>
<goal>wsdl2java</goal>
</goals>
<configuration>
<sourceDirectory>
src/main/config/wsdl2java/myfolder
</sourceDirectory>
<outputDirectory>
${generatedSourcesDirectory}
</outputDirectory>
<testCases>false</testCases>
<serverSide>true</serverSide>
<subPackageByFileName> false
</subPackageByFileName>
<packageSpace> my.api
</packageSpace>
</configuration>
</execution>
</plugin>
顺便说一句,当我启动这个插件时,它最终会出现编译异常,但是,它仍然可以生成WSDD。
然后,如果看看生成的WSDD,我手动制作的WSDD中没有一些有趣的线:
<operation name="sales" qname="operNS:Sales"
xmlns:operNS="urn:Interface"
returnQName="request"
returnType="rtns:SalesResponse"
xmlns:rtns="urn:Interface" soapAction="urn:Interface#Sales" >
<parameter qname="in" type="tns:SalesRequest" xmlns:tns="urn:Interface"/>
</operation>
这部分: returnQName =&#34; request&#34;
它还会生成&#34; typeMapping&#34;标签(但我用beanMapping)
因此,只要我将此更改添加到我的文件中,我就能完成所有工作。
实际上,最初用于生成我的初始源代码我使用了另一个插件:maven-antrun-plugin
但是没有选择生成WSDD。