ws-wsif-user mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From jdep...@brunswickwdi.com
Subject Re: WSIF complexsoap dynamic client
Date Mon, 03 Nov 2003 15:48:32 GMT
Nirmal,

I needed to do the same thing, and ended up writing my own axis 
TypeMappingImpl.  I used org.apache.axis.encoding.DefaultTypeMapping as an 
example, and changed the mapping of all the complex types to my own 
Serializer and Deserializer factories.  You then need to register the new 
type mapping with the message context in WSIFOperation_ApacheAxis.java

        TypeMappingRegistry tmr = msgContext.getTypeMappingRegistry();
        tmr.registerDefault(new MyNewTypeMapping());

This may not be the best way to do it.  It seems like you should be able 
to override a complex type dynamically, but I couldn't find a way.  Let me 
know if you find a better solution.

Jeff De Pons

WDI
200 Fairway Drive, Unit 184, Vernon Hills, IL 60061
P: 847.970.6827 F: 847.970.6869
www.brunswickwdi.com




Naina S <mlnaina@yahoo.com>
11/02/2003 05:59 PM
Please respond to wsif-user

 
        To:     Nirmal Mukhi <nmukhi@us.ibm.com>
        cc:     wsif-user@ws.apache.org
        Subject:        Re: WSIF complexsoap dynamic client


Hello Nirmal,
Thanks a lot for your response.
Actually my problem is : I am trying to invoke the "getCountries" method 
similar to the sample example shown in WSIF samples. 
 
<types> 
- <s:element name="getCountries">
  <s:complexType /> 
  </s:element>
- <s:complexType name="ArrayOfString">
- <s:sequence>
  <s:element minOccurs="0" maxOccurs="unbounded" name="string" nillable="true" type="s:string"
/> 
  </s:sequence>
  </s:complexType>
- <s:element name="getCountriesResponse">
- <s:complexType>
- <s:sequence>
  <s:element minOccurs="0" maxOccurs="1" name="getCountriesResult" type="s0:ArrayOfString"
/> 
  </s:sequence>
  </s:complexType>
 
As  "getCountries" method return an object of "ArrayOfString" I am trying 
to map it.
 
                 // map types
       service.mapType(
     new QName("http://www.abundanttech.com/WebServices/Population", "ArrayOfString"),
              Class.forName(
                  "com.abundanttech.www.ArrayOfString"));
 
But still it say's it is unable to deserialize "getCountriesResponse" 
so I am mapping it
 
service.mapType(
     new QName("http://www.abundanttech.com/WebServices/Population", "getCountriesResponse"),
              Class.forName(
                  "com.abundanttech.www.GetCountriesResponse"));
 
After executing the method
    operation.executeRequestResponseOperation(input, output, fault)
 
I am getting the following errors: I am not understanding why it is unable 
to get the Object Part for "getCountriesResult" where as the samething 
works fine for your sample.
 
LatLongReturn zipInfo =
      (LatLongReturn) output.getObjectPart("GetLatLongResult");
 
 
Exception in thread "main" org.apache.wsif.WSIFException: Cannot get part 
'getCo
untriesResult'. Part was not found in message
        at 
org.apache.wsif.base.WSIFDefaultMessage.handlePartNotFoundException(U
nknown Source)
        at org.apache.wsif.base.WSIFDefaultMessage.getObjectPart(Unknown 
Source)

 
I am not understanding what I am missing.
When I do the 
WSIFUtils.getWrappedDocLiteralPart(outParts ,opName+"Response");
for "getCountries" method I am not able to get the Parts which are under 
<types> of the wsdl.
I am wondering is there a way to display the results in raw xml format?
 
Any suggestions would be of great help to me
Thanks,
 
 
 



Nirmal Mukhi <nmukhi@us.ibm.com> wrote:

Hi, 

Please post your queries to wsif-user@ws.apache.org. 

It looks like you haven't mapped the complex types in your response 
message. The exception is pretty clear in saying that it doesn't know how 
to deserialize {http://www.abundanttech.com/WebServices/Population}getCountriesResponse, 
that is to say it doesn't know how to convert an XML element of this type 
to a java object. 

Nirmal. 



Naina S <mlnaina@yahoo.com> 
10/29/2003 09:27 PM 
        
        To:        Nirmal Mukhi/Watson/IBM@IBMUS 
        cc:        ant.elder@uk.ibm.com 
        Subject:        WSIF complexsoap dynamic client



Hello , 
As my school project I am trying to invoke webservices dynamically for 
which I am using your example for complexsoap dynamic client. I am using 
WSIF 2.0. I am using this code for invoking the Population web service.I 
am enclosing the wsdl doc as an attachment.I made the following changes to 
invoke the "getCountries" method . I am enclosing the below code as an 
attachment. 
 
public class CmplxSoap_populat ion_test {
   public static void main(String[] args) throws Exception { 
        /* args[0] is the zip code
       if (args.length != 2) {
           System.out.println(
               "Usage: java complexsoap.client.dynamic.Run <wsdl location> 
<zip code>");
           System.exit(1);
       }
 */ 
        // create a service factory
       WSIFServiceFactory factory = WSIFServiceFactory.newInstance();
       WSIFService service =
           factory.getService(
               args[0],
               null,
            &nb sp;  null,
               "http://www.abundanttech.com/WebServices/Population",
               "PopulationWSSoap"); 
        // map types
       service.mapType(
     new QName("http://www.abundanttech.com/WebServices/Population", "ArrayOfString"),
              Class.forName(
                  "com.abundanttech.www.ArrayOfString"));
 
       // get the port
       WSIFPort port = service.getPort(); 
&nbs p;       // create the operation
 
       WSIFOperation operation = port.createOperation("getCountries"); 
        // create the input, output and fault messages associated with 
this operation
       WSIFMessage input = operation.createInputMessage();
       WSIFMessage output = operation.createOutputMessage();
       WSIFMessage fault = operation.createFaultMessage(); 
        // populate the input message
      // input.setObjectPart("strCountry", args[1]);
     //  input.setObjectPart("LicenseKey", ""); 
 

       // do the invocation
//try{
 //operation.executeInputOnlyOperation(input);
     if (operation.executeRequestResponseOperation(input, output, fault)) 
{
           // invocation succeeded, extract information from output
           // message 

           Object zipInfo =
              output.getObjectPart("getCountriesResult"); 
 
                Class cl = zipInfo.getClass();
             System.out.println(zipInfo.getClass().getName()); 
              Method[] mem = cl.getDeclaredMethods(); 
              for(int i =0; i< mem.length; i++){ 
      if(mem[i].getName().startsWith("get") && 
(mem[i].getParameterTypes().length) == 0)
     {
     System.out.println((mem[i].invoke(zipInfo,null)).toString()); 
      } 

    } 
 System.out.println(mem[7].getName()); 
 } 
} 
 
 
  
But I am getting the following errors: Any help will be of great help to 
me 
 
.wsdl
- Exception:
org.xml.sax.SAXException: Deserializing parameter 'getCountriesResponse': 
could
not find deserializer for type 
{http://www.abundanttech.com/WebServices/Populat
ion}getCountriesResponse
       at 
org.apache.axis.message.RPCHandler.onStartChild(RPCHandler.java:276)
       at 
org.apache.axis.encoding.DeserializationContextImpl.startElement(Dese
rializationContextImpl.java:893)
       at 
org.apache.axis.message.SAX2EventRecorder.replay(SAX2EventRecorder.ja
va:200)
       at 
org.apache.axis.message.MessageElement.publishToHandler(MessageElemen
t.java:684)
       at 
org.apache.axis.message.RPCElement.deserialize(RPCElement.java:241)
       at 
org.apache.axis.message.RPCElement.getParams(RPCElement.java:265)
       at org.apache.axis.client.Call.invoke(Call.java:1871)
       at org.apache.axis.client.Call.invoke(Call.java:1777)
       at org.apache.axis.client.Call.invoke(Call.java:1315)
       at 
org.apache.wsif.providers.soap.apacheaxis.WSIFOperation_ApacheAxis.in
vokeAXISDocStyle(Unknown Source)
       at 
org.apache.wsif.providers.soap.apacheaxis.WSIFOperation_ApacheAxis.in
vokeRequestResponseOperation(Unknown Source)
       at 
org.apache.wsif.providers.soap.apacheaxis.WSIFOperation_ApacheAxis.ex
ecuteRequestResponseOperation(Unknown Source)
       at 
client.dynamic.CmplxSoap_population_test.main(CmplxSoap_population_te
st.java:90)
Exception in thread "main" org.apache.wsif.WSIFException: exception on 
AXIS invo
ke: ; nested exception is:
       org.xml.sax.SAXException: Deserializing parameter 
'getCountriesResponse'
:  could not find deserializer for type 
{http://www.abundanttech.com/WebServices
/Population}getCountriesResponse; nested exception is:
       org.xml.sax.SAXException: Deserializing parameter 
'getCountriesResponse'
:  could not find deserializer for type 
{http://www.abundanttech.com/WebServices
/Population}getCountriesResponse
       at 
org.apache.wsif.providers.soap.apacheaxis.WSIFOperation_ApacheAxis.in
vokeAXISDocStyle(Unknown Source)
       at 
org.apache.wsif.providers.soap.apacheaxis.WSIFOperation_ApacheAxis.in
vokeRequestResponseOperation(Unknown Source)
       at 
org.apache.wsif.providers.soap.apacheaxis.WSIFOperation_ApacheAxis.ex
ecuteRequestResponseOperation(Unknown Source)
       at 
client.dynamic.CmplxSoap_population_test.main(CmplxSoap_population_te
st.java:90)
Caused by: org.xml.sax.SAXException: Deserializing parameter 
'getCountriesRespon
se':  could not find deserializer for type 
{http://www.abundanttech.com/WebServi
ces/Population}getCountriesResponse
       at org.apache.axis.AxisFault.makeFault(AxisFault.java:120)
       at org.apache.axis.client.Call.invoke(Call.java:1874)
       at org.apache.axis.client.Call.invoke(Call.java:1777)
       at org.apache.axis.client.Call.invoke(Call.java:1315)
       ... 4 more
Caused by: org.xml.sax.SAXException: Deserializing parameter 
'getCountriesRespon
se':  could not find deserializer for type 
{http://www.abundanttech.com/WebServi
ces/Population}getCountriesResponse
       at 
org.apache.axis.message.RPCHandler.onStartChild(RPCHandler.java:276)
       at 
org.apache.axis.encoding.DeserializationContextImpl.startElement(Dese
rializationContextImpl.java:893)
       at 
org.apache.axis.message.SAX2EventRecorder.replay(SAX2EventRecorder.ja
va:200)
       at 
org.apache.axis.message.MessageElement.publishToHandler(MessageElemen
t.java:684)
       at 
org.apache.axis.message.RPCElement.deserialize(RPCElement.java:241)
      &nb sp;at 
org.apache.axis.message.RPCElement.getParams(RPCElement.java:265)
       at org.apache.axis.client.Call.invoke(Call.java:1871)
       ... 6 more 
 
Thanks, 
Naina 
 
Do you Yahoo!?
Exclusive Video Premiere - Britney Spears<?xml version="1.0" encoding="utf-8"?>
<definitions xmlns:http="http://schemas.xmlsoap.org/wsdl/http/" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"
xmlns:s="http://www.w3.org/2001/XMLSchema" xmlns:s0="http://www.abundanttech.com/WebServices/Population"
xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/" xmlns:tm="http://microsoft.com/wsdl/mime/textMatching/"
xmlns:mime="http://schemas.xmlsoap.org/wsdl/mime/" targetNamespace="http://www.abundanttech.com/WebServices/Population"
xmlns="http://schemas.xmlsoap.org/wsdl/">
 <types>
   <s:schema elementFormDefault="qualified" targetNamespace="http://www.abundanttech.com/WebServices/Population">
     <s:element name="getWorldPopulation">
       <s:complexType />
     </s:element>
     <s:element name="getWorldPopulationResponse">
       <s:complexType>
         <s:sequence>
           <s:element minOccurs="0" maxOccurs="1" 
name="getWorldPopulationResult" />
         </s:sequence>
       </s:complexType>
     </s:element>
     <s:element name="getPopulation">
       <s:complexType>
         <s:sequence>
           <s:element minOccurs="0" maxOccurs="1" name="strCountry" 
type="s:string" />
         </s:sequence>
       </s:complexType>
     </s:element>
     <s:complexType name="Population">
       <s:sequence>
         <s:element minOccurs="0" maxOccurs="1" name="Country" 
type="s:string" />
         <s:element minOccurs="0" maxOccurs="1" name="Date" 
type="s:string" />
         <s:element minOccurs="0" maxOccurs="1" name="Pop" type="s:string" 
/>
       </s:sequence>
     </s:complexType>
     <s:element name="getPopulationResponse">
       <s:complexType>
         <s:sequence>
           <s:element minOccurs="0" maxOccurs="1" 
name="getPopulationResult" type="s0:Population" />
         </s:sequence>
       </s:complexType>
     </s:element>
     <s:element name="getCountries">
       <s:complexType />
     </s:element>
     <s:complexType name="ArrayOfString">
       <s:sequence>
         <s:element minOccurs="0" maxOccurs="unbounded" name="string" 
nillable="true" type="s:string" />
       </s:sequence>
     </s:complexType>
     <s:element name="getCountriesResponse">
       <s:complexType>
         <s:sequence>
           <s:element minOccurs="0" maxOccurs="1" 
name="getCountriesResult" type="s0:ArrayOfString" />
         </s:sequence>
       </s:complexType>
     </s:element>
     <s:element name="anyType" nillable="true" />
     <s:element name="Population" nillable="true" type="s0:Population" />
     <s:element name="ArrayOfString" nillable="true" 
type="s0:ArrayOfString" />
   </s:schema>
 </types>
 <message name="getWorldPopulationSoapIn">
   <part name="parameters" element="s0:getWorldPopulation" />
 </message>
 <message name="getWorldPopulationSoapOut">
   <part name="parameters" element="s0:getWorldPopulationResponse" />
 </message>
 <message name="getPopulationSoapIn">
   <part name="parameters" element="s0:getPopulation" />
 </message>
 <message name="getPopulationSoapOut">
   <part name="parameters" element="s0:getPopulationResponse" />
 </message>
 <message name="getCountriesSoapIn">
   <part name="parameters" element="s0:getCountries" />
 </message>
 <message name="getCountriesSoapOut">
   <part name="parameters" element="s0:getCountriesResponse" />
 </message>
 <message name="getWorldPopulationHttpGetIn" />
 <message name="getWorldPopulationHttpGetOut">
   <part name="Body" element="s0:anyType" />
 </message>
 <message name="getPopulationHttpGetIn">
   <part name="strCountry" type="s:string" />
 </message>
 <message name="getPopulationHttpGetOut">
   <part name="Body" element="s0:Population" />
 </message>
 <message name="getCountriesHttpGetIn" />
 <message name="getCountriesHttpGetOut">
   <part name="Body" element="s0:ArrayOfString" />
 </message>
 <message name="getWorldPopulationHttpPostIn" />
 <message name="getWorldPopulationHttpPostOut">
   <part name="Body" element="s0:anyType" />
 </message>
 <message name="getPopulationHttpPostIn">
   <part name="strCountry" type="s:string" />
 </message>
 <message name="getPopulationHttpPostOut">
   <part name="Body" element="s0:Population" />
 </message>
 <message name="getCountriesHttpPostIn" />
 <message name="getCountriesHttpPostOut">
   <part name="Body" element="s0:ArrayOfString" />
 </message>
 <portType name="PopulationWSSoap">
   <operation name="getWorldPopulation">
     <input message="s0:getWorldPopulationSoapIn" />
     <output message="s0:getWorldPopulationSoapOut" />
   </operation>
   <operation name="getPopulation">
     <input message="s0:getPopulationSoapIn" />
     <output message="s0:getPopulationSoapOut" />
   </operation>
   <operation name="getCountries">
     <input message="s0:getCountriesSoapIn" />
     <output message="s0:getCountriesSoapOut" />
   </operation>
 </portType>
 <portType name="PopulationWSHttpGet">
   <operation name="getWorldPopulation">
     <input message="s0:getWorldPopulationHttpGetIn" />
     <output message="s0:getWorldPopulationHttpGetOut" />
   </operation>
   <operation name="getPopulation">
     <input message="s0:getPopulationHttpGetIn" />
     <output message="s0:getPopulationHttpGetOut" />
   </operation>
   <operation name="getCountries">
     <input message="s0:getCountriesHttpGetIn" />
     <output message="s0:getCountriesHttpGetOut" />
   </operation>
 </portType>
 <portType name="PopulationWSHttpPost">
   <operation name="getWorldPopulation">
     <input message="s0:getWorldPopulationHttpPostIn" />
     <output message="s0:getWorldPopulationHttpPostOut" />
   </operation>
   <operation name="getPopulation">
     <input message="s0:getPopulationHttpPostIn" />
     <output message="s0:getPopulationHttpPostOut" />
   </operation>
   <operation name="getCountries">
     <input message="s0:getCountriesHttpPostIn" />
     <output message="s0:getCountriesHttpPostOut" />
   </operation>
 </portType>
 <binding name="PopulationWSSoap" type="s0:PopulationWSSoap">
   <soap:binding transport="http://schemas.xmlsoap.org/soap/http" style="document" />
   <operation name="getWorldPopulation">
     <soap:operation soapAction="http://www.abundanttech.com/WebServices/Population/getWorldPopulation"
style="document" />
     <input>
       <soap:body use="literal" />
     </input>
     <output>
       <so ap:body use="literal" />
     </output>
   </operation>
   <operation name="getPopulation">
     <soap:operation soapAction="http://www.abundanttech.com/WebServices/Population/getPopulation"
style="document" />
     <input>
       <soap:body use="literal" />
     </input>
     <output>
       <soap:body use="literal" />
     </output>
   </operation>
   <operation name="getCountries">
     <soap:operation soapAction="http://www.abundanttech.com/WebServices/Population/getCountries"
style="document" />
     <input>
       <soap:body use="literal" />
     </input>
     <output>
       <soap:body use="literal" />
     </output>
   </operation>
 </binding>
 <binding name="PopulationWSHttpGet" type="s0:PopulationWSHttpGet">
   <http:binding verb="GET" />
   <operation name="getWorldPopulation">
     <http:operation location="/getWorldPopulation" />
     <input>
       <http:urlEncoded />
     </input>
     <output>
       <mime:mimeXml part="Body" />
     </output>
   </operation>
   <operation name="getPopulation">
     <http:operation location="/getPopulation" />
     <input>
       <http:urlEncoded />
     </input>
     <output>
       <mime:mimeXml part="Body" />
     </output>
   </operation>
   <operation name="getCountries">
     <http:operation location="/getCountries" />
     <input>
       <http:urlEncoded />
     </input>
     <output>
       <mime:mimeXml part="Body" />
     </output>
   </operation>
 </binding>
 <binding name="PopulationWSHttpPost" type="s0:PopulationWSHttpPost">
   <http:binding verb="POST" />
   <operation name="getWorldPopulation">
     <http:operation location="/getWorldPopulation" />
     <input>
       <mime:content type="application/x-www-form-urlencoded" />
     </input>
     <output>
       <mime:mimeXml part="Body" />
     </output>
   </operation>
   <operation name="getPopulation">
     <http:operation location="/getPopulation" />
     <input>
       <mime:content type="application/x-www-form-urlencoded" />
     </input>
     <output>
       <mime:mimeXml part="Body" />
     </output>
   </operation>
   <operation name="getCountries">
     <http:operation location="/getCountries" />
     <input>
       <mime:content type="application/x-www-form-urlencoded" />
     </input>
     <output>
       <mime:mimeXml part="Body" />
     </output>
   </operation>
 </binding>
 <service name="PopulationWS">
   <port name="PopulationWSSoap" binding="s0:PopulationWSSoap">
     <soap:address location="http://www.abundanttech.com/WebServices/Population/population.asmx"
/>
   </port>
   <port name="PopulationWSHttpGet" binding="s0:PopulationWSHttpGet">
     <http:address location="http://www.abundanttech.com/WebServices/Population/population.asmx"
/>
   </port>
   <port name="PopulationWSHttpPost" binding="s0:PopulationWSHttpPost">
     <http:address location="http://www.abundanttech.com/WebServices/Population/population.asmx"
/>
   </port>
 </service>
</definitions>package client.dynamic;

import javax.xml.namespace.QName;

import org.apache.wsif.WSIFMessage;
import org.apache.wsif.WSIFOperation;
import org.apache.wsif.WSIFPort;
import org.apache.wsif.WSIFService;
import org.apache.wsif.WSIFServiceFactory;
import org.apache.wsif.WSIFException;

import com.ibm.jrom.JROMComplexValue;

import java.lang.*;
import java.io.*;
import java.lang.reflect.Method;
import javax.xml.parsers.*;

//import complexsoap.client.stub.com.cdyne.ws.LatLongReturn;
//import stub.com.cdyne.ws.LatLongReturn;

public class CmplxSoap_population_test {
   public static void main(String[] args) throws Exception {

       /* args[0] is the zip code
       if (args.length != 2) {
           System.out.println(
        &nbs p;      "Usage: java complexsoap.client.dynamic.Run <wsdl 
location> <zip code>");
           System.exit(1);
       }
                                 */

       // create a service factory
       WSIFServiceFactory factory = WSIFServiceFactory.newInstance();
       WSIFService service =
           factory.getService(
               args[0],
               null,
               null,
               "http://www.abundanttech.com/WebServices/Population",
               "PopulationWSSoap");

&nb sp;      // map types


       service.mapType(
                                     new QName("http://www.abundanttech.com/WebServices/Population",
"ArrayOfString"),
                                              Class.forName(
 "com.abundanttech.www.ArrayOfString"));



       // get the port
       WSIFPort port = service.getPort();

       // create the operation
  //WSIFOperation operation = port.createOperation("GetLatLong", 
"GetLatLongHttpPostIn","GetLatLongHttpPostOut");
       WSIFOperation operation = port.createOperation("getCountries");


       // create the input, output and fault messages associated with this 
operation
       WSIFMessage input = operation.createInputMessage();
       WSIFMessage output = operation.createOutputMessage();
       WSIFMessage fault = operation.createFaultMessage();

       // populate the input message
      // input.setObjectPart("strCountry", args[1]);
     //  input.setObjectPart("LicenseKey", "");




       // do the invocation
     if (operation.executeRequestResponseOperation(input, output, fault))
     {

           Object zipInfo =
      &nb sp;       output.getObjectPart("getCountriesResult");

                                                  Class cl = 
zipInfo.getClass();
           System.out.println(zipInfo.getClass().getName());

             Method[] mem = cl.getDeclaredMethods();

             for(int i =0; i< mem.length; i++){

 if(mem[i].getName().startsWith("get") && 
(mem[i].getParameterTypes().length) == 0)
                                                                     {
           System.out.println((mem[i].invoke(zipInfo,null)).toString());

                                                                     }


                                                    }

 System.out.println("invoked successfully");
       }// catch(WSIFException e) {
                                                  else{
           System.out.println("Invocation failed");
           // extract fault message info
       }
   }
}
Do you Yahoo!?
Exclusive Video Premiere - Britney Spears


Mime
View raw message