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