2009-08-18 10 views
0

J'ai un service Web qui retourne un objet de jeu de données qui contient la prévision météo actuelle avec 0 ou plusieurs alertes météo pour un comté/état. L'objet dataset contient uniquement un objet Weather et un tableau d'objets Alertes. L'un des clients aimerait l'avoir pour que la réponse donne d'abord la météo au lieu des alertes. Existe-t-il un moyen de spécifier l'ordre des éléments de réponse? Je pensais que je pouvais juste changer le WSDL pour tracer la météo d'abord, puis les alertes, mais cela n'a rien fait.Spécifier l'ordre des éléments dans une réponse SOAP en utilisant java

Voici la feuille WSDL générique:
(? Eh bien, il a montré formaté dans l'aperçu, mais pas après avoir affiché ... Comment puis-je poster XML formaté ici j'ai essayé d'utiliser en arrière-tiques, ainsi que pré et 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> 

Je ne vois pas comment je pourrais spécifier l'ordre de ma réponse de service.

+3

Collez le WSDL, mettez en surbrillance le lot puis appuyez sur Ctrl-K pour ce retrait en 4 espaces. –

+0

Vous aurez besoin de dire quelque chose sur la façon dont vous avez créé le service. Quelle boîte à outils avez-vous utilisé? JAX-WS, ou quoi? Quelle version? Etc. –

+0

J'ai utilisé JAX-WS 2.0 et j'ai utilisé l'axe apache 1.4 pour construire le service web. – ravun

Répondre

1

Dans de nombreux cas, le simple fait de modifier le WSDL ne modifie pas le service, et c'est le service qui détermine l'ordre des éléments dans le fichier XML.

+0

Oui, j'ai réalisé plus tard que le WSDL est simplement la définition d'un utilisateur pour construire un client à partir de. J'ai essayé de google JAXB et JAX-WS mais je ne sais pas quoi chercher ... il semble que les éléments sont simplement énumérés alphabétiquement dans la plupart des cas. – ravun

+0

J'allais dire hein?!? jusqu'à ce que je me rende compte que vous aviez également écrit un commentaire sur le PO. Je pense que ce commentaire doit être inclus dans votre réponse, car un service qui ne respecte pas son WSDL est un service interrompu. – kdgregory

1

Nous pouvons modifier l'ordre en ajoutant des annotations JAXB dans le fichier java spécifique.

Par exemple: @XmlType (propOrder = { "x", "y", "z"})