Sunday, December 3, 2017

Top-down Web Service Generation using AXIS1 is taking my complexType apart

Leave a Comment

This is my entire WSDL:

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

When I generate a stub (using Eclipse Oxygen, top-down, Axis1), the function are generated like these:

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

Why is TokenRequest class kept intact, while BatchCommand and HttpHeaders are dismantled?

I tried adding more sub-elements under HttpHeaders and BatchCommand, but they just get split up as additional parameters. I can't spot any difference between their declarations and getToken's.

1 Answers

Answers 1

If you are talking about getToken2() method then actually they are not dismantled rather if you see httpheaders is actually an array of httpheader so in java code it is converted to an array of httpheaders as parameter to getToken2 and same is the case for the CommandBatch.

And

If you are talking about why they are dismantled from getToken() method then the solution is as given below.

This is because in the wsdl file you have not defined the parameters for getToken() method

For example you have this

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

You should update it like below

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

That is your operation getToken should define the required parameters in the parameterOrder attribute.

And also change the message from

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

to

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

After that it generates the code correctly.

If You Enjoyed This, Take 5 Seconds To Share It

0 comments:

Post a Comment