You are viewing a plain text version of this content. The canonical link for it is here.
Posted to soap-user@ws.apache.org by Doug Haigh <dh...@gatorzone.com> on 2003/03/04 02:43:05 UTC

Response Data Mapping Problems

I am trying to write a Java client that uses Apache SOAP to connect to a
service running gSOAP. I have tried to model it after the addressbook
example in the Apache SOAP toolkit. Unfortunately, when I get back the
response, instead of mapping the data into an AdapterInfo object, the
QueryError is mapped as the response value and the other fields in the
struct are stuck in an vector. Can someone please tell me what is going
wrong?

Thanks


---------------------------------------------
Code:


public class AdapterInfo
{
  private int    QueryError;
  private int    AdapterID;
  private int    MemBase;
  private int    IoBase;

  public AdapterInfo()
  {
  }

  public AdapterInfo(   int    QueryError,
                        int    AdapterID,
                        int    MemBase,
                        int    IoBase)
  {
    this.QueryError         = QueryError       ;
    this.AdapterID          = AdapterID        ;
    this.MemBase            = MemBase          ;
    this.IoBase             = IoBase           ;
  }


  public void setQueryError(int QueryError)
  {
    this.QueryError = QueryError;
  }

  public int getQueryError()
  {
    return QueryError;
  }


  public void setAdapterID(int AdapterID)
  {
    this.AdapterID = AdapterID;
  }

  public int getAdapterID()
  {
    return AdapterID;
  }


  public void setMemBase(int MemBase)
  {
    this.MemBase = MemBase;
  }

  public int getMemBase()
  {
    return MemBase;
  }


  public void setIoBase(int IoBase)
  {
    this.IoBase = IoBase;
  }

  public int getIoBase()
  {
    return IoBase;
  }


  public String toString()
  {
    return "Adapter ID        = " + AdapterID        + "\n" +
           "Query error       = " + QueryError       + "\n" +
           "Memory base       = " + MemBase          + "\n" +
           "IO base           = " + IoBase           + "\n";
  }
}


public String GetAdapterInfo(int AdapterID) // Response???
  {
    String output  = "";

    try
    {
      Call                call    = new Call();
      SOAPMappingRegistry smr     = new SOAPMappingRegistry();
      BeanSerializer      beanSer = new BeanSerializer();
      Vector              params  = new Vector();
      Response            resp;

       smr.mapTypes(Constants.NS_URI_SOAP_ENC,
                   new QName("urn:remote-adap", "GetAdapInfoResponse"),
                   AdapterInfo.class,
                   beanSer,
                   beanSer);

      call.setSOAPMappingRegistry(smr);
      call.setTargetObjectURI("urn:remote-adap");
      call.setMethodName("GetAdapterInfo");
      call.setEncodingStyleURI(Constants.NS_URI_SOAP_ENC);

      params.addElement(new org.apache.soap.rpc.Parameter("Adapter",
int.class, new Integer(AdapterID), null));

      call.setParams(params);

      resp = call.invoke(ServerUrl, "");

      System.out.println("invoke response=" + resp.generatedFault());

      // Check the response.
      if (!resp.generatedFault())
      {
        Vector retParams = resp.getParams();
        Parameter ret = resp.getReturnValue();
        Object info = ret.getValue();
        int i;

        System.out.println("response body part=" +
resp.getBodyPart(0).toString());
        System.out.println("response part count=" + resp.getPartCount());
        System.out.println("vector part count=" + retParams.size());

        for (i=0; i < retParams.size(); i++)
        {
          Parameter param = (Parameter)retParams.elementAt(i);

          System.out.println("vector part "+i+" type=" +
param.getValue().getClass());
        }

        System.out.println("output type=" + info.getClass());

        output = info.toString();

        System.out.println("output=" + output);
      }
      else
      {
        Fault fault = resp.getFault();

        System.err.println("Generated fault: " + fault);
      }
    }
    catch (SOAPException se)
    {
      System.err.println("Caught SOAPException (" +
                         se.getFaultCode() + "): " +
                         se.getMessage());
      return output;
    }
    catch (MessagingException me)
    {
      System.err.println("Caught MessagingException:" +
                         me.getMessage());
      return output;
    }

    return output;
  }



------------------------------------------------------------
Request:

<?xml version='1.0' encoding='UTF-8'?>
<SOAP-ENV:Envelope
xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"
                   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
                   xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<SOAP-ENV:Body>
<ns1:GetAdapterInfo xmlns:ns1="urn:remote-adap"
SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">
<Adapter xsi:type="xsd:int">1</Adapter>
</ns1:GetAdapterInfo>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>


------------------------------------------------------------
Response:

<?xml version="1.0" encoding="UTF-8"?>
<SOAP-ENV:Envelope
xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"

xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/"
                   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
                   xmlns:xsd="http://www.w3.org/2001/XMLSchema"
                   xmlns:ns="urn:remote-adap">
<SOAP-ENV:Body
SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">
  <ns:GetAdapInfoResponse>
    <QueryError xsi:type="xsd:int">0</QueryError>
    <AdapterID xsi:type="xsd:int">1</AdapterID>
    <MemBase xsi:type="xsd:int">-100663296</MemBase>
    <IoBase xsi:type="xsd:int">-68173824</IoBase>
  </ns:GetAdapInfoResponse>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>

RE: Response Data Mapping Problems

Posted by Doug Haigh <dh...@gatorzone.com>.
I think I understand now. All SOAP services can return exactly one response.
That one response can consist of many elements. I was thinking my reponse
was a complex element when in fact I need to think of it as containing a
complex element.

Thanks again,
Doug

-----Original Message-----
From: Scott Nichol [mailto:snicholnews@scottnichol.com]
Sent: Tuesday, March 04, 2003 6:11 PM
To: soap-user@ws.apache.org
Subject: RE: Response Data Mapping Problems


The <ns:GetAdapInfoResponse> element is *not* part of the XML you can
map.  You can only map elements within that one, i.e. that element
delimits the response "parameters".  It is *not* part of the
"parameters" themselves.

On 4 Mar 2003 at 7:25, Doug Haigh wrote:

> I thought that the following line in my code did that for me
>
> smr.mapTypes(Constants.NS_URI_SOAP_ENC,
>                      new QName("urn:remote-adap", "GetAdapInfoResponse"),
>                      AdapterInfo.class,
>                      beanSer,
>                      beanSer);
>
> Why does this mapping not associate the 'GetAdapInfoResponse' XML
structure
> in the urn:remote-adap response into the AdapterInfo class?
>
> Doug
>
> -----Original Message-----
> From: Scott Nichol [mailto:snicholnews@scottnichol.com]
> Sent: Tuesday, March 04, 2003 1:02 AM
> To: soap-user@ws.apache.org
> Subject: Re: Response Data Mapping Problems
>
>
> Just as the element
>
> <ns1:GetAdapterInfo xmlns:ns1="urn:remote-adap"
> SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">
>
> is used to wrap the parameters for the method call,
>
>   <ns:GetAdapInfoResponse>
>
> is used to wrap the return value and output parameters.  In other
> words, this element is not part of the return value, so you cannot
> use this element as part of deserializing the return.  If QueryError,
> AdapterID, MemBase and IoBase are supposed to be members of a
> structure, then they should be wrapped in an additional XML element,
> such as
>
>   <ns:GetAdapInfoResponse>
>    <AdapterInfo xsi:type="ns:AdapterInfo">
>     <QueryError xsi:type="xsd:int">0</QueryError>
>     <AdapterID xsi:type="xsd:int">1</AdapterID>
>     <MemBase xsi:type="xsd:int">-100663296</MemBase>
>     <IoBase xsi:type="xsd:int">-68173824</IoBase>
>    </AdapterInfo>
>   </ns:GetAdapInfoResponse>
>
>
> On 3 Mar 2003 at 20:43, Doug Haigh wrote:
>
> > I am trying to write a Java client that uses Apache SOAP to connect to a
> > service running gSOAP. I have tried to model it after the addressbook
> > example in the Apache SOAP toolkit. Unfortunately, when I get back the
> > response, instead of mapping the data into an AdapterInfo object, the
> > QueryError is mapped as the response value and the other fields in the
> > struct are stuck in an vector. Can someone please tell me what is going
> > wrong?
> >
> > Thanks
> >
> >
> > ---------------------------------------------
> > Code:
> >
> >
> > public class AdapterInfo
> > {
> >   private int    QueryError;
> >   private int    AdapterID;
> >   private int    MemBase;
> >   private int    IoBase;
> >
> >   public AdapterInfo()
> >   {
> >   }
> >
> >   public AdapterInfo(   int    QueryError,
> >                         int    AdapterID,
> >                         int    MemBase,
> >                         int    IoBase)
> >   {
> >     this.QueryError         = QueryError       ;
> >     this.AdapterID          = AdapterID        ;
> >     this.MemBase            = MemBase          ;
> >     this.IoBase             = IoBase           ;
> >   }
> >
> >
> >   public void setQueryError(int QueryError)
> >   {
> >     this.QueryError = QueryError;
> >   }
> >
> >   public int getQueryError()
> >   {
> >     return QueryError;
> >   }
> >
> >
> >   public void setAdapterID(int AdapterID)
> >   {
> >     this.AdapterID = AdapterID;
> >   }
> >
> >   public int getAdapterID()
> >   {
> >     return AdapterID;
> >   }
> >
> >
> >   public void setMemBase(int MemBase)
> >   {
> >     this.MemBase = MemBase;
> >   }
> >
> >   public int getMemBase()
> >   {
> >     return MemBase;
> >   }
> >
> >
> >   public void setIoBase(int IoBase)
> >   {
> >     this.IoBase = IoBase;
> >   }
> >
> >   public int getIoBase()
> >   {
> >     return IoBase;
> >   }
> >
> >
> >   public String toString()
> >   {
> >     return "Adapter ID        = " + AdapterID        + "\n" +
> >            "Query error       = " + QueryError       + "\n" +
> >            "Memory base       = " + MemBase          + "\n" +
> >            "IO base           = " + IoBase           + "\n";
> >   }
> > }
> >
> >
> > public String GetAdapterInfo(int AdapterID) // Response???
> >   {
> >     String output  = "";
> >
> >     try
> >     {
> >       Call                call    = new Call();
> >       SOAPMappingRegistry smr     = new SOAPMappingRegistry();
> >       BeanSerializer      beanSer = new BeanSerializer();
> >       Vector              params  = new Vector();
> >       Response            resp;
> >
> >        smr.mapTypes(Constants.NS_URI_SOAP_ENC,
> >                    new QName("urn:remote-adap", "GetAdapInfoResponse"),
> >                    AdapterInfo.class,
> >                    beanSer,
> >                    beanSer);
> >
> >       call.setSOAPMappingRegistry(smr);
> >       call.setTargetObjectURI("urn:remote-adap");
> >       call.setMethodName("GetAdapterInfo");
> >       call.setEncodingStyleURI(Constants.NS_URI_SOAP_ENC);
> >
> >       params.addElement(new org.apache.soap.rpc.Parameter("Adapter",
> > int.class, new Integer(AdapterID), null));
> >
> >       call.setParams(params);
> >
> >       resp = call.invoke(ServerUrl, "");
> >
> >       System.out.println("invoke response=" + resp.generatedFault());
> >
> >       // Check the response.
> >       if (!resp.generatedFault())
> >       {
> >         Vector retParams = resp.getParams();
> >         Parameter ret = resp.getReturnValue();
> >         Object info = ret.getValue();
> >         int i;
> >
> >         System.out.println("response body part=" +
> > resp.getBodyPart(0).toString());
> >         System.out.println("response part count=" +
resp.getPartCount());
> >         System.out.println("vector part count=" + retParams.size());
> >
> >         for (i=0; i < retParams.size(); i++)
> >         {
> >           Parameter param = (Parameter)retParams.elementAt(i);
> >
> >           System.out.println("vector part "+i+" type=" +
> > param.getValue().getClass());
> >         }
> >
> >         System.out.println("output type=" + info.getClass());
> >
> >         output = info.toString();
> >
> >         System.out.println("output=" + output);
> >       }
> >       else
> >       {
> >         Fault fault = resp.getFault();
> >
> >         System.err.println("Generated fault: " + fault);
> >       }
> >     }
> >     catch (SOAPException se)
> >     {
> >       System.err.println("Caught SOAPException (" +
> >                          se.getFaultCode() + "): " +
> >                          se.getMessage());
> >       return output;
> >     }
> >     catch (MessagingException me)
> >     {
> >       System.err.println("Caught MessagingException:" +
> >                          me.getMessage());
> >       return output;
> >     }
> >
> >     return output;
> >   }
> >
> >
> >
> > ------------------------------------------------------------
> > Request:
> >
> > <?xml version='1.0' encoding='UTF-8'?>
> > <SOAP-ENV:Envelope
> > xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"
> >                    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
> >                    xmlns:xsd="http://www.w3.org/2001/XMLSchema">
> > <SOAP-ENV:Body>
> > <ns1:GetAdapterInfo xmlns:ns1="urn:remote-adap"
> > SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">
> > <Adapter xsi:type="xsd:int">1</Adapter>
> > </ns1:GetAdapterInfo>
> > </SOAP-ENV:Body>
> > </SOAP-ENV:Envelope>
> >
> >
> > ------------------------------------------------------------
> > Response:
> >
> > <?xml version="1.0" encoding="UTF-8"?>
> > <SOAP-ENV:Envelope
> > xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"
> >
> > xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/"
> >                    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
> >                    xmlns:xsd="http://www.w3.org/2001/XMLSchema"
> >                    xmlns:ns="urn:remote-adap">
> > <SOAP-ENV:Body
> > SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">
> >   <ns:GetAdapInfoResponse>
> >     <QueryError xsi:type="xsd:int">0</QueryError>
> >     <AdapterID xsi:type="xsd:int">1</AdapterID>
> >     <MemBase xsi:type="xsd:int">-100663296</MemBase>
> >     <IoBase xsi:type="xsd:int">-68173824</IoBase>
> >   </ns:GetAdapInfoResponse>
> > </SOAP-ENV:Body>
> > </SOAP-ENV:Envelope>
> >
>
>
> Scott Nichol
>
> Do not reply directly to this e-mail address, as it is filtered to
> only receive e-mail from specific mailing lists.
>
>
>
>
>


Scott Nichol

Do not reply directly to this e-mail address,
as it is filtered to only receive e-mail from
specific mailing lists.





RE: Response Data Mapping Problems

Posted by Scott Nichol <sn...@scottnichol.com>.
The <ns:GetAdapInfoResponse> element is *not* part of the XML you can 
map.  You can only map elements within that one, i.e. that element 
delimits the response "parameters".  It is *not* part of the 
"parameters" themselves.

On 4 Mar 2003 at 7:25, Doug Haigh wrote:

> I thought that the following line in my code did that for me
> 
> smr.mapTypes(Constants.NS_URI_SOAP_ENC,
>                      new QName("urn:remote-adap", "GetAdapInfoResponse"),
>                      AdapterInfo.class,
>                      beanSer,
>                      beanSer);
> 
> Why does this mapping not associate the 'GetAdapInfoResponse' XML structure
> in the urn:remote-adap response into the AdapterInfo class?
> 
> Doug
> 
> -----Original Message-----
> From: Scott Nichol [mailto:snicholnews@scottnichol.com]
> Sent: Tuesday, March 04, 2003 1:02 AM
> To: soap-user@ws.apache.org
> Subject: Re: Response Data Mapping Problems
> 
> 
> Just as the element
> 
> <ns1:GetAdapterInfo xmlns:ns1="urn:remote-adap"
> SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">
> 
> is used to wrap the parameters for the method call,
> 
>   <ns:GetAdapInfoResponse>
> 
> is used to wrap the return value and output parameters.  In other
> words, this element is not part of the return value, so you cannot
> use this element as part of deserializing the return.  If QueryError,
> AdapterID, MemBase and IoBase are supposed to be members of a
> structure, then they should be wrapped in an additional XML element,
> such as
> 
>   <ns:GetAdapInfoResponse>
>    <AdapterInfo xsi:type="ns:AdapterInfo">
>     <QueryError xsi:type="xsd:int">0</QueryError>
>     <AdapterID xsi:type="xsd:int">1</AdapterID>
>     <MemBase xsi:type="xsd:int">-100663296</MemBase>
>     <IoBase xsi:type="xsd:int">-68173824</IoBase>
>    </AdapterInfo>
>   </ns:GetAdapInfoResponse>
> 
> 
> On 3 Mar 2003 at 20:43, Doug Haigh wrote:
> 
> > I am trying to write a Java client that uses Apache SOAP to connect to a
> > service running gSOAP. I have tried to model it after the addressbook
> > example in the Apache SOAP toolkit. Unfortunately, when I get back the
> > response, instead of mapping the data into an AdapterInfo object, the
> > QueryError is mapped as the response value and the other fields in the
> > struct are stuck in an vector. Can someone please tell me what is going
> > wrong?
> >
> > Thanks
> >
> >
> > ---------------------------------------------
> > Code:
> >
> >
> > public class AdapterInfo
> > {
> >   private int    QueryError;
> >   private int    AdapterID;
> >   private int    MemBase;
> >   private int    IoBase;
> >
> >   public AdapterInfo()
> >   {
> >   }
> >
> >   public AdapterInfo(   int    QueryError,
> >                         int    AdapterID,
> >                         int    MemBase,
> >                         int    IoBase)
> >   {
> >     this.QueryError         = QueryError       ;
> >     this.AdapterID          = AdapterID        ;
> >     this.MemBase            = MemBase          ;
> >     this.IoBase             = IoBase           ;
> >   }
> >
> >
> >   public void setQueryError(int QueryError)
> >   {
> >     this.QueryError = QueryError;
> >   }
> >
> >   public int getQueryError()
> >   {
> >     return QueryError;
> >   }
> >
> >
> >   public void setAdapterID(int AdapterID)
> >   {
> >     this.AdapterID = AdapterID;
> >   }
> >
> >   public int getAdapterID()
> >   {
> >     return AdapterID;
> >   }
> >
> >
> >   public void setMemBase(int MemBase)
> >   {
> >     this.MemBase = MemBase;
> >   }
> >
> >   public int getMemBase()
> >   {
> >     return MemBase;
> >   }
> >
> >
> >   public void setIoBase(int IoBase)
> >   {
> >     this.IoBase = IoBase;
> >   }
> >
> >   public int getIoBase()
> >   {
> >     return IoBase;
> >   }
> >
> >
> >   public String toString()
> >   {
> >     return "Adapter ID        = " + AdapterID        + "\n" +
> >            "Query error       = " + QueryError       + "\n" +
> >            "Memory base       = " + MemBase          + "\n" +
> >            "IO base           = " + IoBase           + "\n";
> >   }
> > }
> >
> >
> > public String GetAdapterInfo(int AdapterID) // Response???
> >   {
> >     String output  = "";
> >
> >     try
> >     {
> >       Call                call    = new Call();
> >       SOAPMappingRegistry smr     = new SOAPMappingRegistry();
> >       BeanSerializer      beanSer = new BeanSerializer();
> >       Vector              params  = new Vector();
> >       Response            resp;
> >
> >        smr.mapTypes(Constants.NS_URI_SOAP_ENC,
> >                    new QName("urn:remote-adap", "GetAdapInfoResponse"),
> >                    AdapterInfo.class,
> >                    beanSer,
> >                    beanSer);
> >
> >       call.setSOAPMappingRegistry(smr);
> >       call.setTargetObjectURI("urn:remote-adap");
> >       call.setMethodName("GetAdapterInfo");
> >       call.setEncodingStyleURI(Constants.NS_URI_SOAP_ENC);
> >
> >       params.addElement(new org.apache.soap.rpc.Parameter("Adapter",
> > int.class, new Integer(AdapterID), null));
> >
> >       call.setParams(params);
> >
> >       resp = call.invoke(ServerUrl, "");
> >
> >       System.out.println("invoke response=" + resp.generatedFault());
> >
> >       // Check the response.
> >       if (!resp.generatedFault())
> >       {
> >         Vector retParams = resp.getParams();
> >         Parameter ret = resp.getReturnValue();
> >         Object info = ret.getValue();
> >         int i;
> >
> >         System.out.println("response body part=" +
> > resp.getBodyPart(0).toString());
> >         System.out.println("response part count=" + resp.getPartCount());
> >         System.out.println("vector part count=" + retParams.size());
> >
> >         for (i=0; i < retParams.size(); i++)
> >         {
> >           Parameter param = (Parameter)retParams.elementAt(i);
> >
> >           System.out.println("vector part "+i+" type=" +
> > param.getValue().getClass());
> >         }
> >
> >         System.out.println("output type=" + info.getClass());
> >
> >         output = info.toString();
> >
> >         System.out.println("output=" + output);
> >       }
> >       else
> >       {
> >         Fault fault = resp.getFault();
> >
> >         System.err.println("Generated fault: " + fault);
> >       }
> >     }
> >     catch (SOAPException se)
> >     {
> >       System.err.println("Caught SOAPException (" +
> >                          se.getFaultCode() + "): " +
> >                          se.getMessage());
> >       return output;
> >     }
> >     catch (MessagingException me)
> >     {
> >       System.err.println("Caught MessagingException:" +
> >                          me.getMessage());
> >       return output;
> >     }
> >
> >     return output;
> >   }
> >
> >
> >
> > ------------------------------------------------------------
> > Request:
> >
> > <?xml version='1.0' encoding='UTF-8'?>
> > <SOAP-ENV:Envelope
> > xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"
> >                    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
> >                    xmlns:xsd="http://www.w3.org/2001/XMLSchema">
> > <SOAP-ENV:Body>
> > <ns1:GetAdapterInfo xmlns:ns1="urn:remote-adap"
> > SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">
> > <Adapter xsi:type="xsd:int">1</Adapter>
> > </ns1:GetAdapterInfo>
> > </SOAP-ENV:Body>
> > </SOAP-ENV:Envelope>
> >
> >
> > ------------------------------------------------------------
> > Response:
> >
> > <?xml version="1.0" encoding="UTF-8"?>
> > <SOAP-ENV:Envelope
> > xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"
> >
> > xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/"
> >                    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
> >                    xmlns:xsd="http://www.w3.org/2001/XMLSchema"
> >                    xmlns:ns="urn:remote-adap">
> > <SOAP-ENV:Body
> > SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">
> >   <ns:GetAdapInfoResponse>
> >     <QueryError xsi:type="xsd:int">0</QueryError>
> >     <AdapterID xsi:type="xsd:int">1</AdapterID>
> >     <MemBase xsi:type="xsd:int">-100663296</MemBase>
> >     <IoBase xsi:type="xsd:int">-68173824</IoBase>
> >   </ns:GetAdapInfoResponse>
> > </SOAP-ENV:Body>
> > </SOAP-ENV:Envelope>
> >
> 
> 
> Scott Nichol
> 
> Do not reply directly to this e-mail address, as it is filtered to
> only receive e-mail from specific mailing lists.
> 
> 
> 
> 
> 


Scott Nichol

Do not reply directly to this e-mail address,
as it is filtered to only receive e-mail from
specific mailing lists.



RE: Response Data Mapping Problems

Posted by Doug Haigh <dh...@gatorzone.com>.
I thought that the following line in my code did that for me

smr.mapTypes(Constants.NS_URI_SOAP_ENC,
                     new QName("urn:remote-adap", "GetAdapInfoResponse"),
                     AdapterInfo.class,
                     beanSer,
                     beanSer);

Why does this mapping not associate the 'GetAdapInfoResponse' XML structure
in the urn:remote-adap response into the AdapterInfo class?

Doug

-----Original Message-----
From: Scott Nichol [mailto:snicholnews@scottnichol.com]
Sent: Tuesday, March 04, 2003 1:02 AM
To: soap-user@ws.apache.org
Subject: Re: Response Data Mapping Problems


Just as the element

<ns1:GetAdapterInfo xmlns:ns1="urn:remote-adap"
SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">

is used to wrap the parameters for the method call,

  <ns:GetAdapInfoResponse>

is used to wrap the return value and output parameters.  In other
words, this element is not part of the return value, so you cannot
use this element as part of deserializing the return.  If QueryError,
AdapterID, MemBase and IoBase are supposed to be members of a
structure, then they should be wrapped in an additional XML element,
such as

  <ns:GetAdapInfoResponse>
   <AdapterInfo xsi:type="ns:AdapterInfo">
    <QueryError xsi:type="xsd:int">0</QueryError>
    <AdapterID xsi:type="xsd:int">1</AdapterID>
    <MemBase xsi:type="xsd:int">-100663296</MemBase>
    <IoBase xsi:type="xsd:int">-68173824</IoBase>
   </AdapterInfo>
  </ns:GetAdapInfoResponse>


On 3 Mar 2003 at 20:43, Doug Haigh wrote:

> I am trying to write a Java client that uses Apache SOAP to connect to a
> service running gSOAP. I have tried to model it after the addressbook
> example in the Apache SOAP toolkit. Unfortunately, when I get back the
> response, instead of mapping the data into an AdapterInfo object, the
> QueryError is mapped as the response value and the other fields in the
> struct are stuck in an vector. Can someone please tell me what is going
> wrong?
>
> Thanks
>
>
> ---------------------------------------------
> Code:
>
>
> public class AdapterInfo
> {
>   private int    QueryError;
>   private int    AdapterID;
>   private int    MemBase;
>   private int    IoBase;
>
>   public AdapterInfo()
>   {
>   }
>
>   public AdapterInfo(   int    QueryError,
>                         int    AdapterID,
>                         int    MemBase,
>                         int    IoBase)
>   {
>     this.QueryError         = QueryError       ;
>     this.AdapterID          = AdapterID        ;
>     this.MemBase            = MemBase          ;
>     this.IoBase             = IoBase           ;
>   }
>
>
>   public void setQueryError(int QueryError)
>   {
>     this.QueryError = QueryError;
>   }
>
>   public int getQueryError()
>   {
>     return QueryError;
>   }
>
>
>   public void setAdapterID(int AdapterID)
>   {
>     this.AdapterID = AdapterID;
>   }
>
>   public int getAdapterID()
>   {
>     return AdapterID;
>   }
>
>
>   public void setMemBase(int MemBase)
>   {
>     this.MemBase = MemBase;
>   }
>
>   public int getMemBase()
>   {
>     return MemBase;
>   }
>
>
>   public void setIoBase(int IoBase)
>   {
>     this.IoBase = IoBase;
>   }
>
>   public int getIoBase()
>   {
>     return IoBase;
>   }
>
>
>   public String toString()
>   {
>     return "Adapter ID        = " + AdapterID        + "\n" +
>            "Query error       = " + QueryError       + "\n" +
>            "Memory base       = " + MemBase          + "\n" +
>            "IO base           = " + IoBase           + "\n";
>   }
> }
>
>
> public String GetAdapterInfo(int AdapterID) // Response???
>   {
>     String output  = "";
>
>     try
>     {
>       Call                call    = new Call();
>       SOAPMappingRegistry smr     = new SOAPMappingRegistry();
>       BeanSerializer      beanSer = new BeanSerializer();
>       Vector              params  = new Vector();
>       Response            resp;
>
>        smr.mapTypes(Constants.NS_URI_SOAP_ENC,
>                    new QName("urn:remote-adap", "GetAdapInfoResponse"),
>                    AdapterInfo.class,
>                    beanSer,
>                    beanSer);
>
>       call.setSOAPMappingRegistry(smr);
>       call.setTargetObjectURI("urn:remote-adap");
>       call.setMethodName("GetAdapterInfo");
>       call.setEncodingStyleURI(Constants.NS_URI_SOAP_ENC);
>
>       params.addElement(new org.apache.soap.rpc.Parameter("Adapter",
> int.class, new Integer(AdapterID), null));
>
>       call.setParams(params);
>
>       resp = call.invoke(ServerUrl, "");
>
>       System.out.println("invoke response=" + resp.generatedFault());
>
>       // Check the response.
>       if (!resp.generatedFault())
>       {
>         Vector retParams = resp.getParams();
>         Parameter ret = resp.getReturnValue();
>         Object info = ret.getValue();
>         int i;
>
>         System.out.println("response body part=" +
> resp.getBodyPart(0).toString());
>         System.out.println("response part count=" + resp.getPartCount());
>         System.out.println("vector part count=" + retParams.size());
>
>         for (i=0; i < retParams.size(); i++)
>         {
>           Parameter param = (Parameter)retParams.elementAt(i);
>
>           System.out.println("vector part "+i+" type=" +
> param.getValue().getClass());
>         }
>
>         System.out.println("output type=" + info.getClass());
>
>         output = info.toString();
>
>         System.out.println("output=" + output);
>       }
>       else
>       {
>         Fault fault = resp.getFault();
>
>         System.err.println("Generated fault: " + fault);
>       }
>     }
>     catch (SOAPException se)
>     {
>       System.err.println("Caught SOAPException (" +
>                          se.getFaultCode() + "): " +
>                          se.getMessage());
>       return output;
>     }
>     catch (MessagingException me)
>     {
>       System.err.println("Caught MessagingException:" +
>                          me.getMessage());
>       return output;
>     }
>
>     return output;
>   }
>
>
>
> ------------------------------------------------------------
> Request:
>
> <?xml version='1.0' encoding='UTF-8'?>
> <SOAP-ENV:Envelope
> xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"
>                    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
>                    xmlns:xsd="http://www.w3.org/2001/XMLSchema">
> <SOAP-ENV:Body>
> <ns1:GetAdapterInfo xmlns:ns1="urn:remote-adap"
> SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">
> <Adapter xsi:type="xsd:int">1</Adapter>
> </ns1:GetAdapterInfo>
> </SOAP-ENV:Body>
> </SOAP-ENV:Envelope>
>
>
> ------------------------------------------------------------
> Response:
>
> <?xml version="1.0" encoding="UTF-8"?>
> <SOAP-ENV:Envelope
> xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"
>
> xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/"
>                    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
>                    xmlns:xsd="http://www.w3.org/2001/XMLSchema"
>                    xmlns:ns="urn:remote-adap">
> <SOAP-ENV:Body
> SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">
>   <ns:GetAdapInfoResponse>
>     <QueryError xsi:type="xsd:int">0</QueryError>
>     <AdapterID xsi:type="xsd:int">1</AdapterID>
>     <MemBase xsi:type="xsd:int">-100663296</MemBase>
>     <IoBase xsi:type="xsd:int">-68173824</IoBase>
>   </ns:GetAdapInfoResponse>
> </SOAP-ENV:Body>
> </SOAP-ENV:Envelope>
>


Scott Nichol

Do not reply directly to this e-mail address, as it is filtered to
only receive e-mail from specific mailing lists.





Re: Response Data Mapping Problems

Posted by Scott Nichol <sn...@scottnichol.com>.
Just as the element

<ns1:GetAdapterInfo xmlns:ns1="urn:remote-adap"
SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">

is used to wrap the parameters for the method call, 

  <ns:GetAdapInfoResponse>

is used to wrap the return value and output parameters.  In other 
words, this element is not part of the return value, so you cannot 
use this element as part of deserializing the return.  If QueryError, 
AdapterID, MemBase and IoBase are supposed to be members of a 
structure, then they should be wrapped in an additional XML element, 
such as

  <ns:GetAdapInfoResponse>
   <AdapterInfo xsi:type="ns:AdapterInfo">
    <QueryError xsi:type="xsd:int">0</QueryError>
    <AdapterID xsi:type="xsd:int">1</AdapterID>
    <MemBase xsi:type="xsd:int">-100663296</MemBase>
    <IoBase xsi:type="xsd:int">-68173824</IoBase>
   </AdapterInfo>
  </ns:GetAdapInfoResponse>

 
On 3 Mar 2003 at 20:43, Doug Haigh wrote:

> I am trying to write a Java client that uses Apache SOAP to connect to a
> service running gSOAP. I have tried to model it after the addressbook
> example in the Apache SOAP toolkit. Unfortunately, when I get back the
> response, instead of mapping the data into an AdapterInfo object, the
> QueryError is mapped as the response value and the other fields in the
> struct are stuck in an vector. Can someone please tell me what is going
> wrong?
> 
> Thanks
> 
> 
> ---------------------------------------------
> Code:
> 
> 
> public class AdapterInfo
> {
>   private int    QueryError;
>   private int    AdapterID;
>   private int    MemBase;
>   private int    IoBase;
> 
>   public AdapterInfo()
>   {
>   }
> 
>   public AdapterInfo(   int    QueryError,
>                         int    AdapterID,
>                         int    MemBase,
>                         int    IoBase)
>   {
>     this.QueryError         = QueryError       ;
>     this.AdapterID          = AdapterID        ;
>     this.MemBase            = MemBase          ;
>     this.IoBase             = IoBase           ;
>   }
> 
> 
>   public void setQueryError(int QueryError)
>   {
>     this.QueryError = QueryError;
>   }
> 
>   public int getQueryError()
>   {
>     return QueryError;
>   }
> 
> 
>   public void setAdapterID(int AdapterID)
>   {
>     this.AdapterID = AdapterID;
>   }
> 
>   public int getAdapterID()
>   {
>     return AdapterID;
>   }
> 
> 
>   public void setMemBase(int MemBase)
>   {
>     this.MemBase = MemBase;
>   }
> 
>   public int getMemBase()
>   {
>     return MemBase;
>   }
> 
> 
>   public void setIoBase(int IoBase)
>   {
>     this.IoBase = IoBase;
>   }
> 
>   public int getIoBase()
>   {
>     return IoBase;
>   }
> 
> 
>   public String toString()
>   {
>     return "Adapter ID        = " + AdapterID        + "\n" +
>            "Query error       = " + QueryError       + "\n" +
>            "Memory base       = " + MemBase          + "\n" +
>            "IO base           = " + IoBase           + "\n";
>   }
> }
> 
> 
> public String GetAdapterInfo(int AdapterID) // Response???
>   {
>     String output  = "";
> 
>     try
>     {
>       Call                call    = new Call();
>       SOAPMappingRegistry smr     = new SOAPMappingRegistry();
>       BeanSerializer      beanSer = new BeanSerializer();
>       Vector              params  = new Vector();
>       Response            resp;
> 
>        smr.mapTypes(Constants.NS_URI_SOAP_ENC,
>                    new QName("urn:remote-adap", "GetAdapInfoResponse"),
>                    AdapterInfo.class,
>                    beanSer,
>                    beanSer);
> 
>       call.setSOAPMappingRegistry(smr);
>       call.setTargetObjectURI("urn:remote-adap");
>       call.setMethodName("GetAdapterInfo");
>       call.setEncodingStyleURI(Constants.NS_URI_SOAP_ENC);
> 
>       params.addElement(new org.apache.soap.rpc.Parameter("Adapter",
> int.class, new Integer(AdapterID), null));
> 
>       call.setParams(params);
> 
>       resp = call.invoke(ServerUrl, "");
> 
>       System.out.println("invoke response=" + resp.generatedFault());
> 
>       // Check the response.
>       if (!resp.generatedFault())
>       {
>         Vector retParams = resp.getParams();
>         Parameter ret = resp.getReturnValue();
>         Object info = ret.getValue();
>         int i;
> 
>         System.out.println("response body part=" +
> resp.getBodyPart(0).toString());
>         System.out.println("response part count=" + resp.getPartCount());
>         System.out.println("vector part count=" + retParams.size());
> 
>         for (i=0; i < retParams.size(); i++)
>         {
>           Parameter param = (Parameter)retParams.elementAt(i);
> 
>           System.out.println("vector part "+i+" type=" +
> param.getValue().getClass());
>         }
> 
>         System.out.println("output type=" + info.getClass());
> 
>         output = info.toString();
> 
>         System.out.println("output=" + output);
>       }
>       else
>       {
>         Fault fault = resp.getFault();
> 
>         System.err.println("Generated fault: " + fault);
>       }
>     }
>     catch (SOAPException se)
>     {
>       System.err.println("Caught SOAPException (" +
>                          se.getFaultCode() + "): " +
>                          se.getMessage());
>       return output;
>     }
>     catch (MessagingException me)
>     {
>       System.err.println("Caught MessagingException:" +
>                          me.getMessage());
>       return output;
>     }
> 
>     return output;
>   }
> 
> 
> 
> ------------------------------------------------------------
> Request:
> 
> <?xml version='1.0' encoding='UTF-8'?>
> <SOAP-ENV:Envelope
> xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"
>                    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
>                    xmlns:xsd="http://www.w3.org/2001/XMLSchema">
> <SOAP-ENV:Body>
> <ns1:GetAdapterInfo xmlns:ns1="urn:remote-adap"
> SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">
> <Adapter xsi:type="xsd:int">1</Adapter>
> </ns1:GetAdapterInfo>
> </SOAP-ENV:Body>
> </SOAP-ENV:Envelope>
> 
> 
> ------------------------------------------------------------
> Response:
> 
> <?xml version="1.0" encoding="UTF-8"?>
> <SOAP-ENV:Envelope
> xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"
> 
> xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/"
>                    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
>                    xmlns:xsd="http://www.w3.org/2001/XMLSchema"
>                    xmlns:ns="urn:remote-adap">
> <SOAP-ENV:Body
> SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">
>   <ns:GetAdapInfoResponse>
>     <QueryError xsi:type="xsd:int">0</QueryError>
>     <AdapterID xsi:type="xsd:int">1</AdapterID>
>     <MemBase xsi:type="xsd:int">-100663296</MemBase>
>     <IoBase xsi:type="xsd:int">-68173824</IoBase>
>   </ns:GetAdapInfoResponse>
> </SOAP-ENV:Body>
> </SOAP-ENV:Envelope>
> 


Scott Nichol

Do not reply directly to this e-mail address, as it is filtered to
only receive e-mail from specific mailing lists.