James:

I made a couple of small changes to your WSDL, notably compressed it into one file and 
corrected the address to match the service on my machine 
("http://localhost:8080/axis/services/quote";).  Then I ran it through WSDL2Java, 
creating a server-side implementation, stubs, and the data classes.

Used this impl:

    public NasdaqQuotes_types.NasdaqQuote getPrice(java.lang.String symbol) throws 
java.rmi.RemoteException {
        NasdaqQuote nq = new NasdaqQuote();
        nq.setSymbol(symbol);
        nq.setLastSalePrice(45.5D);
        return nq;
    }

Then I ran this:

public class NQTest {
    public static void main(String[] args) throws Exception {
        QName svcQName = new QName("http://NasdaqQuotes-Interface";, 
"NasdaqQuotesService");
        QName portQName = new QName("http://NasdaqQuotes-Interface";, "quote");
        QName typeQName = new QName("urn:NasdaqQuotes-types", "NasdaqQuote");
    
        Service service = new Service("NasdaqQuotes.wsdl", svcQName);
        Call call = (Call)service.createCall(portQName, "getPrice");
        call.registerTypeMapping(NasdaqQuote.class, typeQName, 
BeanSerializerFactory.class,
                                 BeanDeserializerFactory.class);
        call.setReturnType(typeQName);
        NasdaqQuote nq = (NasdaqQuote)call.invoke(new Object [] { "foo" });
        System.out.println(nq.toString());
    }
}

And when I had the debugger stop at the println at the end, the NasdaqQuote was filled 
in correctly.  So I don't know what's going on for you - it could be that something 
weird is happening with the import, since I did squash it into one WSDL, but that 
seems unlikely.  I'm using the latest codebase, btw.

Did you figure anything more out after you were fortified by your snack? :)

--Glen

> -----Original Message-----
> From: James M Snell [mailto:[EMAIL PROTECTED]]
> Sent: Thursday, January 09, 2003 7:18 PM
> To: [EMAIL PROTECTED]
> Cc: Doug Davis
> Subject: RE: Bean Mapping Issues
> 
> 
> Ok, there definitely *appears* to be a problem.
> 
> I'm initializing the client using the following code (the 
> WSDL file is 
> attached)
> 
>     private static final QName NQqName = 
>       new QName("urn:NasdaqQuotes-types", "NasdaqQuote");
> 
>     QName serviceQN = new QName("http://"; + NQ, NQ + "Service" );
>     QName portQN    = new QName("http://"; + NQ, "quote");
>     Service service = new Service(new URL(wsdlURL), serviceQN );
>     Call call       = (Call)service.createCall(portQN, "getPrice");
>     call.registerTypeMapping(
>       NasdaqQuote.class,
>       NQqName,
>       BeanSerializerFactory.class,
>       BeanDeserializerFactory.class);
>     call.setReturnType(NQqName); 
>     return (NasdaqQuote)call.invoke( new Object[] { symbol } );
> 
> When running this, I'm getting the following error while parsing the 
> response.
> 
>            org.xml.sax.SAXException: Bad types (class 
> NasdaqQuote -> class 
> java.lang.String)
>                 at 
> org.apache.axis.message.RPCHandler.onStartChild(RPCHandler.java:309)
> 
> Digging in, I added a couple of lines of code to RPCHandler 
> to see what 
> was going on and came up with this:
> 
> Starting at line 215, there is code to retrieve the 
> ParameterDesc for the 
> current element.  This lookup is done using the QName of the current 
> element:
> 
>             if (isResponse) {
>                 paramDesc = operation.getOutputParamByQName(qname);
>             } else {
>                 paramDesc = operation.getInputParamByQName(qname);
>             }
> 
> Anyway, the code properly serializes the request, sends it to 
> the server, 
> the server processes it right, sends a proper response, then boom, it 
> blows up.  The problem appears to be that the paramDesc 
> returned by the 
> above operation is wrong given the qname.
> 
> isResponse == true
> qname == getPriceReturn
> paramDesc == 
>     name:       symbol
>     typeEntry:  null
>     mode:       IN
>     isReturn:   false
>     typeQName:  {http://schemas.xmlsoap.org/soap/encoding/}string
>     javaType:   class java.lang.String
>     inHeader:   false
>     outHeader:  false
> 
> In other words, even though a) we're in the response and b) qname == 
> getPriceReturn, the method operation.getOutputParamByQName is 
> returning an 
> IN only parameter from the request message, not the response.
> 
> This is making the RPCHandler think it needs to deserialize 
> the data as a 
> string rather than a NasdaqQuote object.  This makes it mad 
> and it spits 
> at me.  That's not nice and I want it to stop.  I've told it to stop 
> spitting at me and it's not listening.  That's not nice either. 
> 
> There's either a) something wrong with my WSDL (possible, but 
> unlikely 
> since the code works perfectly with Axis 1.0) or b) something 
> wrong with 
> the code that initializes the call/parameters/etc from the 
> WSDL document. 
> In either case, it's pissing me off. :-)  I'm going to grab a 
> snack and 
> keep digging.
> 
> 
> 
> - James Snell
>      IBM Emerging Technologies
>      [EMAIL PROTECTED]
>      (559) 587-1233 (office)
>      (700) 544-9035 (t/l)
>      Programming Web Services With SOAP
>          O'Reilly & Associates, ISBN 0596000952
> 
>      Have I not commanded you? Be strong and courageous. 
>      Do not be terrified, do not be discouraged, for the Lord your 
>      God will be with you whereever you go.    - Joshua 1:9
> 
> 
> 
> Glen Daniels <[EMAIL PROTECTED]>
> 01/09/2003 02:20 PM
> Please respond to axis-dev
> 
> 
> To
> "'[EMAIL PROTECTED]'" <[EMAIL PROTECTED]>
> cc
> 
> bcc
> 
> Subject
> RE: Bean Mapping Issues
> 
> 
> 
> 
> Hm.  Well, to potentially belabor the obvious... why don't 
> you send us the 
> WSDL? :)
> 
> --Glen
> 
> > -----Original Message-----
> > From: James M Snell [mailto:[EMAIL PROTECTED]]
> > Sent: Thursday, January 09, 2003 5:09 PM
> > To: [EMAIL PROTECTED]
> > Subject: RE: Bean Mapping Issues
> >
> >
> > Starting with a WSDL.  This is definitely being caused by a post 1.0
> > change in the axis code.  I just tested again with Axis 1.0
> > and it works
> > perfectly.
> >
> > - James Snell
> >      IBM Emerging Technologies
> >      [EMAIL PROTECTED]
> >      (559) 587-1233 (office)
> >      (700) 544-9035 (t/l)
> >      Programming Web Services With SOAP
> >          O'Reilly & Associates, ISBN 0596000952
> >
> >      Have I not commanded you? Be strong and courageous.
> >      Do not be terrified, do not be discouraged, for the Lord your
> >      God will be with you whereever you go.    - Joshua 1:9
> >
> >
> >
> > Glen Daniels <[EMAIL PROTECTED]>
> > 01/09/2003 01:48 PM
> > Please respond to axis-dev
> >
> >
> > To
> > "'[EMAIL PROTECTED]'" <[EMAIL PROTECTED]>
> > cc
> >
> > bcc
> >
> > Subject
> > RE: Bean Mapping Issues
> >
> >
> >
> >
> > The type mapping defines "NasdaqQuote" as the local part of
> > the *type*
> > QName.
> >
> > The "getPriceReturn" element name has nothing to do with the
> > type mapping,
> > that's the default (operationName + "Return") for operations with no
> > "returnQName" specified in the WSDD.  You can change it by
> > adding to the
> > WSDD:
> >
> > <operation name="getPrice" returnQName="ns:NasdaqQuote"
> > xmlns:ns="whatever"/>
> >
> > This hasn't changed since 1.0.  Are you starting from a 
> WSDL here, or
> > coding manually?  If the former, something may have changed wrt the
> > WSDL2Java handling....?
> >
> > --Glen
> >
> > > -----Original Message-----
> > > From: James M Snell [mailto:[EMAIL PROTECTED]]
> > > Sent: Thursday, January 09, 2003 3:27 PM
> > > To: [EMAIL PROTECTED]
> > > Subject: Bean Mapping Issues
> > >
> > >
> > > Hmm.. I'm trying to chase down a problem I'm having with a
> > > bean mapping
> > > declaration and want to see if anyone else can spot the
> > problem right
> > > away.
> > >
> > > The service worked perfectly with Axis 1.0 and doesn't work now.
> > >
> > > Here's the deploy.wsdd
> > >
> > >     <deployment name="test" 
> xmlns="http://xml.apache.org/axis/wsdd/";
> > >         
> xmlns:java="http://xml.apache.org/axis/wsdd/providers/java";>
> > >       <service name="quote" provider="java:RPC">
> > >         <parameter value="NasdaqQuotes" name="className"/>
> > >         <parameter value="getPrice" name="allowedMethods"/>
> > >       </service>
> > >       <beanMapping
> > >         xmlns:nq="urn:NasdaqQuotes-types"
> > >         languageSpecificType="java:NasdaqQuote"
> > >         qname="nq:NasdaqQuote"/>
> > >     </deployment>
> > >
> > > The "quote" service's "getPrice" method returns a NasdaqQuote
> > > object that
> > > has been mapped to the "urn:NasdaqQuotes-types" namespace
> > > using the qname
> > > "NasdaqQuote".... however, below is the SOAP message that I'm
> > > getting in
> > > response:
> > >
> > > <?xml version="1.0" encoding="UTF-8"?>
> > > <soapenv:Envelope
> > > xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/";
> > > xmlns:xsd="http://www.w3.org/2001/XMLSchema";
> > > xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance";>
> > >  <soapenv:Body>
> > >   <ns1:getPriceResponse
> > > soapenv:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/";
> > > xmlns:ns1="http://NasdaqQuotes-Interface";>
> > >    <getPriceReturn xsi:type="ns2:NasdaqQuote"
> > > xmlns:ns2="urn:NasdaqQuotes-types">
> > >     <todaysHigh xsi:type="xsd:double">55.25</todaysHigh>
> > >     <fiftyTwoWeekHigh 
> xsi:type="xsd:double">55.25</fiftyTwoWeekHigh>
> > >     <tradingStatus xsi:type="xsd:string">ACTIVE</tradingStatus>
> > >     <symbol xsi:type="xsd:string">XXX</symbol>
> > >     <totalShares xsi:type="xsd:long">100</totalShares>
> > >     <market xsi:type="xsd:string">NYSE</market>
> > >     <todaysLow xsi:type="xsd:double">55.25</todaysLow>
> > >     <issuerWebSite xsi:type="xsd:string">none</issuerWebSite>
> > >     <errorText xsi:type="xsd:string"></errorText>
> > >     <fiftyTwoWeekLow xsi:type="xsd:double">55.25</fiftyTwoWeekLow>
> > >     <lastSalePrice xsi:type="xsd:double">55.25</lastSalePrice>
> > >     <netPercentChange xsi:type="xsd:string">0</netPercentChange>
> > >     <shareVolume xsi:type="xsd:long">10</shareVolume>
> > >     <netPriceChange xsi:type="xsd:double">0.0</netPriceChange>
> > >     <previousClosePrice
> > > xsi:type="xsd:double">55.25</previousClosePrice>
> > >    </getPriceReturn>
> > >   </ns1:getPriceResponse>
> > >  </soapenv:Body>
> > > </soapenv:Envelope>
> > >
> > > The problem should be obvious.  Instead of the expected qname
> > > "NasdaqQuote", the return value is called "getPriceReturn".
> > > The type is
> > > right, but the qname is wrong.  Under Axis 1.0, the qname was
> > > NasdaqQuote.
> > >  What changed?
> > >
> > > The reason I started having to look into this is that I'm
> > getting the
> > > following error when serializing the response:
> > >
> > >   faultCode:
> > > {http://schemas.xmlsoap.org/soap/envelope/}Server.userException
> > >   faultSubcode:
> > >   faultString: org.xml.sax.SAXException: Bad types (class
> > > NasdaqQuote ->
> > > class java.lang.String)
> > >   faultActor: null
> > >   faultNode: null
> > >
> > > Thoughts?
> > >
> > > - James Snell
> > >      IBM Emerging Technologies
> > >      [EMAIL PROTECTED]
> > >      (559) 587-1233 (office)
> > >      (700) 544-9035 (t/l)
> > >      Programming Web Services With SOAP
> > >          O'Reilly & Associates, ISBN 0596000952
> > >
> > >      Have I not commanded you? Be strong and courageous.
> > >      Do not be terrified, do not be discouraged, for the Lord your
> > >      God will be with you whereever you go.    - Joshua 1:9
> > >
> > 
> 

Reply via email to