【问题标题】:Specify order of elements in a SOAP response using java使用 java 指定 SOAP 响应中元素的顺序
【发布时间】:2009-08-18 16:23:45
【问题描述】:

我有一个 Web 服务,它返回一个数据集对象,其中包含当前天气预报以及县/州的 0 个或多个天气警报。数据集对象只包含一个 Weather 对象和一个 Alerts 对象数组。其中一个客户希望拥有它,因此响应首先给出天气而不是警报。有没有办法指定响应元素的顺序?我以为我可以更改 WSDL 以先绘制天气,然后再绘制警报,但这并没有做任何事情。

这是通用 WSDL 表:
(嗯,它在预览中显示为格式化但在发布后没有显示......我如何在这里发布格式化的 XML?我尝试使用反引号以及 pre 和 code)。

<wsdl:definitions ...>
 <wsdl:types>
  <schema elementFormDefault="qualified" targetNamespace="http://ws.sample.com" xmlns="http://www.w3.org/2001/XMLSchema">
   <import namespace="http://objects.sample.com"/>
   <element name="getAll">
    <complexType>
     <sequence>
      <element name="county" type="xsd:string"/>
      <element name="state" type="xsd:string"/>
      <element name="latitude" type="xsd:double"/>
      <element name="longitude" type="xsd:double"/>
     </sequence>
    </complexType>
   </element>
   <element name="getAllResponse">
    <complexType>
     <sequence>
      <element name="getAllReturn" type="tns1:DataSet"/>
     </sequence>
    </complexType>
   </element>
   <complexType name="ArrayOf_tns1_Alert">
    <sequence>
     <element maxOccurs="unbounded" minOccurs="0" name="item" type="tns1:Alert"/>
    </sequence>
   </complexType>
  </schema>
  <schema elementFormDefault="qualified" targetNamespace="http://objects.sample.com" xmlns="http://www.w3.org/2001/XMLSchema">
   <import namespace="http://ws.sample.com"/>
   <complexType name="Alert">
    <sequence>
     <element name="county" nillable="true" type="xsd:string"/>
     <element name="endDate" nillable="true" type="xsd:dateTime"/>
     <element name="locationCode" nillable="true" type="xsd:string"/>
     <element name="startDate" nillable="true" type="xsd:dateTime"/>
     <element name="state" nillable="true" type="xsd:string"/>
     <element name="title" nillable="true" type="xsd:string"/>
     <element name="warning" nillable="true" type="xsd:string"/>
    </sequence>
   </complexType>
   <complexType name="Weather">
    <sequence>
     <element name="chancePrecipitation" type="xsd:int"/>
     <element name="period" nillable="true" type="xsd:string"/>
     <element name="skyConditions" nillable="true" type="xsd:string"/>
     <element name="temperature" type="xsd:int"/>
     <element name="temperatureType" nillable="true" type="xsd:string"/>
     <element name="temperatureUnit" nillable="true" type="xsd:string"/>
     <element name="windDirection" nillable="true" type="xsd:string"/>
     <element name="windSpeed" type="xsd:int"/>
     <element name="windUnit" nillable="true" type="xsd:string"/>
    </sequence>
   </complexType>
   <complexType name="DataSet">
    <sequence>
     <element name="weather" nillable="true" type="tns1:Weather"/>
     <element name="alert" nillable="true" type="impl:ArrayOf_tns1_Alert"/>
    </sequence>
   </complexType>
  </schema>
 </wsdl:types>
   <wsdl:message name="getAllResponse">
      <wsdl:part element="impl:getAllResponse" name="parameters"/>
   </wsdl:message>
   <wsdl:message name="getAllRequest">
      <wsdl:part element="impl:getAll" name="parameters"/>
   </wsdl:message>
   <wsdl:portType name="TSTWeather">
      <wsdl:operation name="getAll">
         <wsdl:input message="impl:getAllRequest" name="getAllRequest"/>
         <wsdl:output message="impl:getAllResponse" name="getAllResponse"/>
      </wsdl:operation>
   </wsdl:portType>
   <wsdl:binding name="TSTWeatherSoapBinding" type="impl:TSTWeather">
      <wsdlsoap:binding style="document" transport="http://schemas.xmlsoap.org/soap/http"/>
      <wsdl:operation name="getAll">
         <wsdlsoap:operation soapAction=""/>
         <wsdl:input name="getAllRequest">
            <wsdlsoap:body use="literal"/>
         </wsdl:input>
         <wsdl:output name="getAllResponse">
            <wsdlsoap:body use="literal"/>
         </wsdl:output>
      </wsdl:operation>
   </wsdl:binding>
   <wsdl:service name="TSTWeatherService">
      <wsdl:port binding="impl:TSTWeatherSoapBinding" name="TSTWeather">
         <wsdlsoap:address location="http://localhost:8282/Services/service/TSTWeather"/>
      </wsdl:port>
   </wsdl:service>
</wsdl:definitions>

我不知道如何指定服务响应的顺序。

【问题讨论】:

  • 粘贴 WSDL,突出显示该地段,然后按 Ctrl-K 将其缩进 4 个空格。
  • 您需要说明一下您是如何创建服务的。你用的是什么工具包? JAX-WS,还是什么?什么版本?等等。
  • 我使用 JAX-WS 2.0 和 apache axis 1.4 来构建 Web 服务。
  • 您是从 WSDL 构建服务,还是从服务构建 WSDL?如果是前者,则再次运行它,使服务器的定义与 WSDL 匹配。

标签: java soap response


【解决方案1】:

在很多情况下,仅仅改变 WSDL 并不会改变服务,而是服务决定了 XML 中元素的顺序。

【讨论】:

  • 是的,后来我意识到 WSDL 只是用户用来构建客户端的定义。我一直在尝试用谷歌搜索 JAXB 和 JAX-WS,但我不知道要搜索什么……在大多数情况下,这些元素似乎只是按字母顺序列出的。
  • 我想说啊?!?直到我意识到您还对 OP 发表了评论。我认为该评论需要纳入您的答案,因为不遵循其 WSDL 的服务是一个损坏的服务。
【解决方案2】:

我们可以通过在特定的 java 文件中添加 JAXB 注释来更改顺序。

例如:@XmlType(propOrder = {"x", "y", "z"})

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-12-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多