2017-11-24 119 views
8

To jest mój cały WSDL:odgórne Web Generation obsługa za pomocą oś1 bierze mój complexType siebie

<?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> 

Kiedy wygenerować niedopałek (przy użyciu Eclipse tlen, top-down, oś1), funkcja są generowane takie jak:

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; 
} 

Dlaczego TokenRequest klasa przechowywane w stanie nienaruszonym, a BatchCommand i HttpHeaders są zdemontowane?

Próbowałem dodać więcej pod-elementów w HttpHeaders i BatchCommand, ale one po prostu dzielą się jako dodatkowe parametry. Nie widzę żadnej różnicy między ich deklaracjami a getToken.

Odpowiedz

4

Jeśli mówimy o getToken2() metodę wtedy rzeczywiście nie są one zdemontowane, a jeśli widzisz httpheaders jest rzeczywiście tablicą httpheader tak w kodzie java przekształcany jest do tablicy httpheaders jako parametr do getToken2 i samo jest w przypadku CommandBatch.

I

Jeśli mówimy o tym, dlaczego są one demontowane z GetToken() metoda to rozwiązanie jest takie, jak podano poniżej.

To dlatego, że w pliku WSDL nie zdefiniowano parametry GetToken() metoda

Na przykład masz ten

<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> 

Należy zaktualizować go jak poniżej

<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> 

To jest Twoja operacja getToken powinien zdefiniować wymagane parametry w atrybucie parametersOrder.

A także zmienić wiadomość z

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

do

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

Po że prawidłowo generuje kod.

Możesz również przyjrzeć się temu answer Wyjaśnia, w jaki sposób używany jest atrybut maxOccurs. Jeśli nie zostanie określony, element pojawi się tylko raz. Dlatego też getToken nie został zmieniony na tablicę tak jak inne parametry, a zamiast tego został zastąpiony jednym wystąpieniem TokenRequest, który jest rzeczywiście zawarty w getToken complexType. Jest to pojedyncze wystąpienie TokenRequest

+0

getToken (stary API) ma jeden parametr, natomiast getToken2 (nowy interfejs API) ma 3. Mam pytanie, dlaczego typy parametrów BatchCommand i HttpHeaders nie są zawarte w wygenerowanym kodzie, ale getToken jest. Jeśli generator kodu zdecyduje się zoptymalizować i pominąć BatchCommand i HttpHeaders, powinien zastosować tę samą logikę do getToken i wyodrębnić swoje pola do oddzielnych parametrów. –

+0

@KCWong Proszę spojrzeć na ten https://stackoverflow.com/a/33686479/578855 – muasif80

+0

httpHeaders i EACommand są ponownie prezentowane jako kolekcje innych typów i tam maxOccurs jest nieograniczony, dlatego są one zamieniane na tablice.Natomiast maxOccurs dla getToken nie jest określony, więc domyślnie wynosi 1 i dlatego nie jest zamieniany na tablicę w kodzie Java. To jest prawidłowe wyjaśnienie. – muasif80