6

我有 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(使用 JAX-RPC)生成了 Java 类。

然后我创建了 Axis 服务(MyService 实现了 InterfacePortType)。

我准备了 XSDD 文件,将 MyService 部署到 Web 应用程序。

因此,然后我调用了 MyServive 的一种方法,并在服务器端响应序列化的那一刻得到了这个错误:

意外元素名称:预期=请求,实际=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 中使用“请求”而不是“SalesReturn” ?

我不知道这个“返回”后缀是从哪里来的。

- 我已经做了一些步骤:

我用谷歌搜索,发现 WSDL 中应该有 'schema elementFormDefault="qualified"'。但是我不能更改 WSDL,因为它是外部的,它是由外部提供商提供给我的。

4

2 回答 2

2

我找到了解决方案,我使用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="request"

它还生成“typeMapping”标签(但我使用了 beanMapping)

所以,只要我把这些更改放到我的文件中,我就一切正常了。

实际上,最初为了生成我的初始源,我使用了另一个插件:maven-antrun-plugin

但是没有生成 WSDD 的选项。

于 2012-09-28T17:05:44.857 回答
0

错误告诉你的是请求应该看起来像

<soapenv:Envelope> <request> <SalesRequest>...

你正在发送

<soapenv:Envelope> <SalesReturn>...

获得这个数字的最佳方法是尝试使用 SOAP UI 之类的工具,并将它们发送的有效负载与您从工具生成的内容进行比较——一些工具可以选择在输入/输出消息中包装或解开部件名称。

希望这可以帮助

于 2012-09-28T00:55:56.700 回答