When abstract is true, your java class must be declared abstract. It is not
your case, so removed it.
Try to use gsoap soapcpp2 with flag -t to have typed messages, so your
messages will have xsi:type attributes.

..
 <name xsi:type="soapenc:string">Cubicle</name>
 <sides xsi:type="xsd:int">4</sides>
 <size xsi:type="xsd:int">40</size>
...

Christophe

> -----Original Message-----
> From: Zhou Jian Han [mailto:[EMAIL PROTECTED]
> Sent: Thursday, October 21, 2004 3:08 PM
> To: [EMAIL PROTECTED]
> Subject: RE: Does Axis support polymorphism (dynamic send back the derived
> class)
> 
> Hi Christophe,
> According to your suggestion, I took out the inherited fileds. and I
> checked my PolymorphStub.java, it does include both Shape and Square,
> see below:
> 
> public PolymorphStub(javax.xml.rpc.Service service) throws
> org.apache.axis.AxisFault {
>         if (service == null) {
>             super.service = new org.apache.axis.client.Service();
>         } else {
>             super.service = service;
>         }
>             java.lang.Class cls;
>             javax.xml.namespace.QName qName;
>             java.lang.Class beansf =
> org.apache.axis.encoding.ser.BeanSerializerFactory.class;
>             java.lang.Class beandf =
> org.apache.axis.encoding.ser.BeanDeserializerFactory.class;
>             java.lang.Class enumsf =
> org.apache.axis.encoding.ser.EnumSerializerFactory.class;
>             java.lang.Class enumdf =
> org.apache.axis.encoding.ser.EnumDeserializerFactory.class;
>             java.lang.Class arraysf =
> org.apache.axis.encoding.ser.ArraySerializerFactory.class;
>             java.lang.Class arraydf =
> org.apache.axis.encoding.ser.ArrayDeserializerFactory.class;
>             java.lang.Class simplesf =
> org.apache.axis.encoding.ser.SimpleSerializerFactory.class;
>             java.lang.Class simpledf =
> org.apache.axis.encoding.ser.SimpleDeserializerFactory.class;
>             qName = new javax.xml.namespace.QName("urn:copy", "Shape");
>             cachedSerQNames.add(qName);
>             cls = copy.Shape.class;
>             cachedSerClasses.add(cls);
>             cachedSerFactories.add(beansf);
>             cachedDeserFactories.add(beandf);
> 
>             qName = new javax.xml.namespace.QName("urn:copy", "Square");
>             cachedSerQNames.add(qName);
>             cls = copy.Square.class;
>             cachedSerClasses.add(cls);
>             cachedSerFactories.add(beansf);
>             cachedDeserFactories.add(beandf);
> 
>     }
> 
> But when I run it, it still throw following:
> SEVERE: Exception:
> org.xml.sax.SAXException: Invalid element in copy.Shape - size
>         at
> org.apache.axis.encoding.ser.BeanDeserializer.onStartChild(BeanDeseri
> alizer.java:260)
>         at
> org.apache.axis.encoding.DeserializationContextImpl.startElement(Dese
> rializationContextImpl.java:963)
>         at
> org.apache.axis.message.SAX2EventRecorder.replay(SAX2EventRecorder.ja
> va:198)
>         at
> org.apache.axis.message.MessageElement.publishToHandler(MessageElemen
> t.java:722)
>         at
> org.apache.axis.message.RPCElement.deserialize(RPCElement.java:233)
>         at
> org.apache.axis.message.RPCElement.getParams(RPCElement.java:347)
>         at org.apache.axis.client.Call.invoke(Call.java:2272)
>         at org.apache.axis.client.Call.invoke(Call.java:2171)
>         at org.apache.axis.client.Call.invoke(Call.java:1691)
>         at copy.PolymorphStub.getPoly(PolymorphStub.java:143)
>         at copy.Tester.main(Tester.java:18)
> Exception in thread "main" AxisFault
>  ...
> 
> I saw your first reply mail, you have abstract="true", so I add this to
> .wsdl, see below:
> <complexType abstract="true" name="Shape">
>    <sequence>
>      <element name="name" type="xsd:string" minOccurs="0" maxOccurs="1"
> nillable="true"/>
>      <element name="sides" type="xsd:int" minOccurs="1" maxOccurs="1"/>
>    </sequence>
>   </complexType>
>   <complexType name="Square">
>    <complexContent>
>     <extension base="ns:Shape">
>      <sequence>
>      <element name="size" type="xsd:int" minOccurs="1" maxOccurs="1"/>
>      </sequence>
>     </extension>
>    </complexContent>
>   </complexType>
> 
> This time after I run it, it throws different exception:
> SEVERE: Exception:
> org.xml.sax.SAXException: Unable to create JavaBean of type copy.Shape.
> Missing
>  default constructor?  Error was: java.lang.InstantiationException.
>         at
> org.apache.axis.encoding.ser.BeanDeserializer.startElement(BeanDeseri
> alizer.java:159)
>         at
> org.apache.axis.encoding.DeserializationContextImpl.startElement(Dese
> rializationContextImpl.java:976)
>         at
> org.apache.axis.message.SAX2EventRecorder.replay(SAX2EventRecorder.ja
> va:198)
>         at
> org.apache.axis.message.MessageElement.publishToHandler(MessageElemen
> t.java:722)
>         at
> org.apache.axis.message.RPCElement.deserialize(RPCElement.java:233)
>         at
> org.apache.axis.message.RPCElement.getParams(RPCElement.java:347)
>         at org.apache.axis.client.Call.invoke(Call.java:2272)
>         at org.apache.axis.client.Call.invoke(Call.java:2171)
>         at org.apache.axis.client.Call.invoke(Call.java:1691)
>         at copy.PolymorphStub.getPoly(PolymorphStub.java:143)
>         at copy.Tester.main(Tester.java:18)
> Exception in thread "main" AxisFault
> 
> I checked both Square.java and Shape.java, they do have default
> constructor, any idea?
> I don't know how to run tcpmonitor because every time my client open a
> random port, and I have no idea  which port should I specify to
> listening when using tcpmonitor, so I use different tools to get the
> packet sending from the server, here are the sever reply xml:
> HTTP/1.1 200 OK
> Server: gSOAP/2.7
> Content-Type: text/xml; charset=utf-8
> Content-Length: 538
> Connection: close
> 
> <?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/2000/XMLSchema-instance";
> xmlns:xsd="http://www.w3.org/2000/XMLSchema"; xmlns:ns="urn:copy">
> <SOAP-ENV:Body
> SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/";>
> <ns:polytestResponse>
> <out xsi:type="ns:Square">
> <name>Cubicle</name>
> <sides>4</sides>
> <size>40</size>
> </out>
> </ns:polytestResponse></SOAP-ENV:Body></SOAP-ENV:Envelope>
> 
> 
> Do you have any idea, why the axis still try to build "Shape" object
> instead of "Square"? and why it complain Missing default constructor at
> second time?
> 
> Thanks,
> Georgia
> 
> -----Original Message-----
> From: Christophe Roudet [mailto:[EMAIL PROTECTED]
> Sent: Thursday, October 21, 2004 11:07 AM
> To: [EMAIL PROTECTED]
> Subject: RE: Does Axis support polymorphism (dynamic send back the
> derived class)
> 
> 
> I don't think you have to declare the inherited fields sides and size in
> the
> derived type Square.
> 
> Check if you have a serializer declared for Square in your generated
> stub.
> 
> public XxxxxStub(javax.xml.rpc.Service service) throws
> org.apache.axis.AxisFault {
>      if (service == null) {
>         super.service = new org.apache.axis.client.Service();
>      } else {
>         super.service = service;
>      }
>      ...
>      qName = new javax.xml.namespace.QName("...", "Square");
>      cachedSerQNames.add(qName);
>      cls = xxx.Square.class;
>      cachedSerClasses.add(cls);
>      cachedSerFactories.add(beansf);
>      cachedDeserFactories.add(beandf);
>     ....
> }
> 
> 
> Then check with the tcpmonitor what was send back by the server.
> 
> Christophe
> 
> 




Reply via email to