2017-11-24 2 views
8

nimmt Dies ist meine gesamte WSDL:Top-down-Web-Service-Generation AXIS1 mit meinem complex auseinander

<?xml version="1.0" encoding="utf-8"?> 
<definitions name="TokenService" 
       targetNamespace="urn:mace:ideas:TokenNamespace" 
       xmlns="http://schemas.xmlsoap.org/wsdl/" 
       xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" 
       xmlns:tns="urn:mace:ideas:TokenNamespace" 
       xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 
    <types> 
     <xs:schema targetNamespace="urn:mace:ideas:TokenNamespace" 
        version="1.0" 
        xmlns:tns="urn:mace:ideas:TokenNamespace" 
        xmlns:xs="http://www.w3.org/2001/XMLSchema"> 

      <!-- A single HTTP header --> 
      <xs:complexType name="httpHeader"> 
       <xs:sequence> 
       <xs:element name="Content" type="xs:string" /> 
       <xs:element name="Usage"> 
        <xs:simpleType> 
        <xs:restriction base="xs:string"> 
         <xs:enumeration value="new" id="new" /> 
         <xs:enumeration value="always" id="always" /> 
         <xs:enumeration value="once" id="once" /> 
        </xs:restriction> 
        </xs:simpleType> 
       </xs:element> 
       </xs:sequence> 
      </xs:complexType>  

      <!-- A list of HTTP headers --> 
      <xs:complexType name="httpHeaders"> 
       <xs:sequence> 
        <xs:element name="httpHeader" type="tns:httpHeader" minOccurs="0" maxOccurs="unbounded"/> 
       </xs:sequence> 
      </xs:complexType> 

      <!-- EACommand Id --> 
      <xs:simpleType name="EACommandId"> 
       <xs:restriction base="xs:string"> 
        <xs:enumeration value="ReadDG" /> 
        <xs:enumeration value="ReadRD" /> 
        <xs:enumeration value="WriteRD" /> 
        <xs:enumeration value="VerifyData" /> 
        <xs:enumeration value="CheckAge" /> 
       </xs:restriction> 
      </xs:simpleType>     

      <!-- EACommand operator --> 
      <xs:simpleType name="EACommandOperator"> 
       <xs:restriction base="xs:string"> 
        <xs:enumeration value="equal" /> 
        <xs:enumeration value="less" /> 
        <xs:enumeration value="greater" /> 
       </xs:restriction> 
      </xs:simpleType>     

      <!-- EACommand --> 
      <xs:complexType name="EACommand"> 
       <xs:sequence> 
        <xs:element minOccurs="1" maxOccurs="1" name="EACommandId" type="tns:EACommandId" /> 
        <xs:element minOccurs="0" maxOccurs="1" name="dataId" type="xs:integer" /> 
        <xs:element minOccurs="0" maxOccurs="1" name="EACommandOperator" type="tns:EACommandOperator" /> 
        <xs:element minOccurs="0" maxOccurs="1" name="value" type="xs:string" /> 
       </xs:sequence> 
      </xs:complexType> 

      <!-- Batch command --> 
      <xs:complexType name="batchCommand"> 
       <xs:sequence> 
        <xs:element name="stopOnAnyError" type="xs:boolean" nillable="false" /> 
        <xs:element minOccurs="0" maxOccurs="unbounded" name="command" type="tns:EACommand" /> 
       </xs:sequence> 
      </xs:complexType>  

      <!-- TokenRequest --> 
      <xs:complexType name="tokenRequest"> 
       <xs:sequence> 
        <xs:element minOccurs="1" name="raCode" type="xs:string" /> 
        <xs:element minOccurs="1" name="appRefId" type="xs:string" /> 
        <xs:element minOccurs="1" name="deptCode" type="xs:string" /> 
        <xs:element minOccurs="1" name="raArtifactReceiverURL" type="xs:string" /> 
        <xs:element minOccurs="1" name="target" type="xs:string" /> 
        <xs:element minOccurs="0" name="dvnHash" type="xs:string" /> 
        <xs:element minOccurs="0" name="msgHash" type="xs:string" /> 
        <xs:element minOccurs="0" name="spinAction" type="xs:string" /> 
        <xs:element minOccurs="0" name="locale" type="xs:string" /> 
        <xs:element minOccurs="0" name="termsAndConditions" type="xs:string" /> 
        <xs:element minOccurs="0" name="removeCard" type="xs:string" /> 
        <xs:element minOccurs="0" name="reader" type="xs:string" /> 
       </xs:sequence> 
      </xs:complexType> 

      <!-- GetToken, a wrapper for TokenRequest --> 
      <xs:complexType name="getToken"> 
       <xs:sequence> 
       <xs:element minOccurs="1" name="tokenRequest" type="tns:tokenRequest" /> 
       </xs:sequence> 
      </xs:complexType> 

      <!-- TokenResponse --> 
      <xs:complexType name="tokenResponse"> 
       <xs:sequence> 
        <xs:element minOccurs="1" name="ideasArtifactReceiverURL" type="xs:string" /> 
        <xs:element minOccurs="1" name="ideasMAURL" type="xs:string" /> 
        <xs:element minOccurs="1" name="errorCode" type="xs:string" /> 
        <xs:element minOccurs="1" name="errorMessage" type="xs:string" /> 
       </xs:sequence> 
      </xs:complexType> 

      <!-- getTokenResponse, a wrapper for TokenResponse --> 
      <xs:complexType name="getTokenResponse"> 
       <xs:sequence> 
        <xs:element minOccurs="1" name="return" type="tns:tokenResponse" /> 
       </xs:sequence> 
      </xs:complexType> 

      <xs:element name="getToken" type="tns:getToken" /> 
      <xs:element name="batchCommand" type="tns:batchCommand" /> 
      <xs:element name="httpHeaders" type="tns:httpHeaders" /> 
      <xs:element name="getTokenResponse" type="tns:getTokenResponse" /> 

     </xs:schema> 
    </types> 

    <message name="TokenService_getToken"> 
     <part element="tns:getToken" name="getToken" /> 
    </message> 

    <message name="TokenService_getToken2"> 
     <part element="tns:getToken" name="getToken" /> 
     <part element="tns:batchCommand" name="batchCommand" /> 
     <part element="tns:httpHeaders" name="httpHeaders" /> 
    </message> 

    <message name="TokenService_getTokenResponse"> 
     <part element="tns:getTokenResponse" name="getTokenResponse" /> 
    </message> 

    <portType name="TokenService"> 
     <operation name="getToken" parameterOrder="getToken"> 
      <input message="tns:TokenService_getToken" /> 
      <output message="tns:TokenService_getTokenResponse" /> 
     </operation> 
     <operation name="getToken2" parameterOrder="getToken batchCommand httpHeaders"> 
      <input message="tns:TokenService_getToken2" /> 
      <output message="tns:TokenService_getTokenResponse" /> 
     </operation> 
    </portType> 

    <binding name="TokenServiceBinding" type="tns:TokenService"> 
     <soap:binding style="document" transport="http://schemas.xmlsoap.org/soap/http" /> 
     <operation name="getToken"> 
      <soap:operation soapAction="" /> 
      <input> 
       <soap:body use="literal" /> 
      </input> 
      <output> 
       <soap:body use="literal" /> 
      </output> 
     </operation> 
     <operation name="getToken2"> 
      <soap:operation soapAction="" /> 
      <input> 
       <soap:body use="literal" /> 
      </input> 
      <output> 
       <soap:body use="literal" /> 
      </output> 
     </operation> 
    </binding> 

    <service name="TokenService"> 
     <port binding="tns:TokenServiceBinding" name="TokenServicePort"> 
      <soap:address location="https://www0.ideas.hksarg/ideas/TokenService" /> 
     </port> 
    </service> 

</definitions> 

Wenn ich einen Stummel (mit Eclipse Oxygen, top-down, Axis1) erzeugen, wird die Funktion erzeugt wie diese:

public TokenNamespace.ideas.mace.TokenResponse getToken(TokenNamespace.ideas.mace.TokenRequest tokenRequest) throws java.rmi.RemoteException { 
    return null; 
} 

public TokenNamespace.ideas.mace.TokenResponse getToken2(TokenNamespace.ideas.mace.TokenRequest tokenRequest, boolean stopOnAnyError, TokenNamespace.ideas.mace.EACommand[] command, TokenNamespace.ideas.mace.HttpHeader[] httpHeader) throws java.rmi.RemoteException { 
    return null; 
} 

Warum TokenRequest Klasse intakt gehalten wird, während BatchCommand und httpheaders demontiert?

Ich habe versucht, weitere Unterelemente unter HttpHeaders und BatchCommand hinzuzufügen, aber sie werden nur als zusätzliche Parameter aufgeteilt. Ich kann keinen Unterschied zwischen ihren Erklärungen und getTokens erkennen.

Antwort

4

Wenn Sie getToken2() Methode sprechen sie abgebaut werden dann eigentlich nicht lieber, wenn Sie sehen httpheaders tatsächlich eine Reihe von httpheader so in Java-Code ist es zu einer Reihe von httpheaders als Parameter getToken2 und gleiche umgewandelt wird, ist der Fall für die CommandBatch.

Und

Wenn Sie sprechen darüber, warum sie von getToken abgebaut werden() -Methode dann die Lösung, wie unten angegeben.

Dies liegt daran, in der WSDL-Datei nicht die Parameter für getToken() -Methode

Zum Beispiel können Sie diese wie

<portType name="TokenService"> 
     <operation name="getToken" parameterOrder="getToken"> 
      <input message="tns:TokenService_getToken" /> 
      <output message="tns:TokenService_getTokenResponse" /> 
     </operation> 
     <operation name="getToken2" parameterOrder="getToken batchCommand httpHeaders"> 
      <input message="tns:TokenService_getToken2" /> 
      <output message="tns:TokenService_getTokenResponse" /> 
     </operation> 
    </portType> 

Sie sollte es definiert haben aktualisieren unten

<portType name="TokenService"> 
     <operation name="getToken" parameterOrder="getToken batchCommand httpHeaders"> 
      <input message="tns:TokenService_getToken" /> 
      <output message="tns:TokenService_getTokenResponse" /> 
     </operation> 
     <operation name="getToken2" parameterOrder="getToken batchCommand httpHeaders"> 
      <input message="tns:TokenService_getToken2" /> 
      <output message="tns:TokenService_getTokenResponse" /> 
     </operation> 
    </portType> 

Das ist Ihre Operation getToken sollte die erforderlichen Parameter im Attribut ParameterOrder definieren.

und ändern auch die Nachricht von

<message name="TokenService_getToken"> 
     <part element="tns:httpHeaders" name="httpHeaders" /> 
    </message> 

zu

<message name="TokenService_getToken"> 
     <part element="tns:getToken" name="getToken" /> 
     <part element="tns:batchCommand" name="batchCommand" /> 
     <part element="tns:httpHeaders" name="httpHeaders" /> 
    </message> 

Danach wird es den Code nicht korrekt erzeugt.

Sie können weiter einen Blick darauf werfen answer Es wird erläutert, wie maxOccurs Attribut verwendet wird. Wenn es nicht angegeben ist, wird ein Element nur einmal vorkommen. Aus diesem Grund wurde getToken nicht wie die anderen Parameter in ein Array geändert, sondern durch das eine Vorkommen von TokenRequest ersetzt, das tatsächlich in getToken complexType enthalten ist. Das ist ein einziges Vorkommen von TokenRequest

+0

getToken (die alte API) hat einen Parameter, während getToken2 (die neue API) hat 3. Die Frage, die ich habe, ist, warum die Parametertypen BatchCommand und HttpHeaders nicht in generierten Code enthalten sind getToken ist. Wenn der Codegenerator entscheidet, BatchCommand und HttpHeaders zu optimieren und auszulassen, sollte er dieselbe Logik auf getToken anwenden und seine Felder in separate Parameter extrahieren. –

+0

@KCWong Bitte beachten Sie diese https://StackOverflow.com/a/33686479/578855 – muasif80

+0

Die httpHeaders und EACommand sind als Sammlungen anderer Typen neu darstellbar und dort MaxOccurs ist unbegrenzt, daher werden sie in Arrays geändert.Während maxOccurs für getToken nicht angegeben ist, ist es standardmäßig auf 1 gesetzt und wird daher im Java-Code nicht in ein Array geändert. Dies ist die korrekte Erklärung. – muasif80