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