I am trying to establish if the problem described below is an existing bug, or if it
is new. I looked in the AXIS BUGZILLA, and found a couple array related bugs, though
they do not seem similar to the one I got.
I hope that anybody out there can help. I have written a web service using BEA
weblogic 6.1. It returns a value object with another "detail" array of value object
inside it. I have included the WSDL of the service and the original send and received
SOAP XML message snatched using TCPMON. I am trying to use the webservice using AXIS,
I have generated the client code from the services WSDL using WSDL2JAVA. It had
worked great for my first simple webservice but threw a
"java.lang.IllegalArgumentException: argument type mismatch" exception with my more
complex test. I downloaded the AXIS source and managed to debug the code some. The
AXIS client receives the SOAP message 100% intact from the webservice. But looks like
it gets confused and tries to process the returned array of VOs twice. The web service
worked just great when consumed by a BEA weblogic test client. But I would much
rather use a more "generic" client like AXIS.
Please find below my version numbers, error message stack trace, WSDL, and SOAP sent
and received XML. Thanks in advance for looking at my email!
Version Info:
App server: BEA weblogic 6.1
JDK: 1.3.1
AXIS version: Beta 1 March 16
Error Message Stack Trace:
- Could not convert [Lejb.cruise.booking.companyname.com.CruiseRouteVO; to bean field
'cruiseRouteVOArr[0]', type ejb.cruise.booking.companyname.com.CruiseRouteVO
- Exception:
java.lang.IllegalArgumentException: argument type mismatch
at
org.apache.axis.encoding.ser.BeanPropertyTarget.set(BeanPropertyTarget.java:131)
at
org.apache.axis.encoding.DeserializerImpl.valueComplete(DeserializerImpl.java:258)
at
org.apache.axis.encoding.ser.ArrayDeserializer.valueComplete(ArrayDeserializer.java:539)
at
org.apache.axis.encoding.DeserializerImpl.endElement(DeserializerImpl.java:501)
at
org.apache.axis.encoding.DeserializationContextImpl.endElement(DeserializationContextImpl.java:865)
at org.apache.axis.message.SAX2EventRecorder.replay(SAX2EventRecorder.java:203)
at
org.apache.axis.message.MessageElement.publishToHandler(MessageElement.java:578)
at org.apache.axis.message.RPCElement.deserialize(RPCElement.java:207)
at org.apache.axis.message.RPCElement.getParams(RPCElement.java:231)
at org.apache.axis.client.Call.invoke(Call.java:1607)
at org.apache.axis.client.Call.invoke(Call.java:1515)
at org.apache.axis.client.Call.invoke(Call.java:1095)
at
ws.cruise.booking.companyname.com.CruiseWSBindingStub.getCruise(CruiseWSBindingStub.java:163)
at
ws.cruise.booking.companyname.com.CruiseWSTestCaseGetCruise.test2CruiseWSPortGetCruise(CruiseWSTestCaseGetCruise.java:31)
at
ws.cruise.booking.companyname.com.CruiseWSTestCaseGetCruise.main(CruiseWSTestCaseGetCruise.java:76)
Remote Exception caught: java.lang.IllegalArgumentException: argument type mismatch
End of WS call reached
WSDL:
<definitions targetNamespace="java:com.companyname.booking.cruise.ws"
xmlns="http://schemas.xmlsoap.org/wsdl/" xmlns:util="java:java.util"
xmlns:xsi="http://www.w3.org/1999/XMLSchema-instance"
xmlns:tns="java:com.companyname.booking.cruise.ws"
xmlns:ejb="java:com.companyname.booking.cruise.ejb"
xmlns:xsd="http://www.w3.org/1999/XMLSchema"
xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/">
<types>
<schema targetNamespace="java:java.util"
xmlns="http://www.w3.org/1999/XMLSchema" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"
xmlns:soap="http://schemas.xmlsoap.org/soap/encoding/" xmlns:util="java:java.util">
<complexType name="Date">
<attribute name="time" type="long"/>
<attribute name="date" type="int"/>
<attribute name="minutes" type="int"/>
<attribute name="month" type="int"/>
<attribute name="year" type="int"/>
<attribute name="day" type="int"/>
<attribute name="hours" type="int"/>
<attribute name="timezoneOffset" type="int"/>
<attribute name="seconds" type="int"/>
</complexType>
</schema>
<schema targetNamespace="java:com.companyname.booking.cruise.ejb"
xmlns="http://www.w3.org/1999/XMLSchema" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"
xmlns:soap="http://schemas.xmlsoap.org/soap/encoding/"
xmlns:ejb="java:com.companyname.booking.cruise.ejb">
<complexType name="ArrayOfCruiseVO">
<complexContent>
<restriction base="soap:Array">
<attribute ref="soap:arrayType"
wsdl:arrayType="ejb:CruiseVO[]"/>
</restriction>
</complexContent>
</complexType>
<complexType name="CruiseRouteVO">
<attribute name="arriveTime" type="string"/>
<attribute name="arriveCity" type="string"/>
<attribute name="cruiseNum" type="int"/>
<attribute name="departTime" type="string"/>
<attribute name="departCity" type="string"/>
<attribute name="routeNum" type="int"/>
</complexType>
<complexType name="CruiseVO">
<attribute name="briefDesc" type="string"/>
<attribute name="label" type="string"/>
<attribute name="costPp" type="int"/>
<attribute name="costPc" type="int"/>
<attribute name="cruiseNum" type="int"/>
<sequence>
<element name="cruiseRouteVOArr"
type="ejb:CruiseRouteVO" maxOccurs="unbounded"/>
</sequence>
</complexType>
</schema>
</types>
<message name="getAvailCruisesRequest">
<part name="arg0" type="util:Date"/>
</message>
<message name="getAvailCruisesResponse">
<part name="return" type="ejb:ArrayOfCruiseVO"/>
</message>
<message name="getCruiseRequest">
<part name="arg0" type="xsd:int"/>
</message>
<message name="getCruiseResponse">
<part name="return" type="ejb:CruiseVO"/>
</message>
<portType name="CruiseWSPortType">
<operation name="getAvailCruises">
<input message="tns:getAvailCruisesRequest"/>
<output message="tns:getAvailCruisesResponse"/>
</operation>
<operation name="getCruise">
<input message="tns:getCruiseRequest"/>
<output message="tns:getCruiseResponse"/>
</operation>
</portType>
<binding name="CruiseWSBinding" type="tns:CruiseWSPortType">
<soap:binding style="rpc"
transport="http://schemas.xmlsoap.org/soap/http"/>
<operation name="getAvailCruises">
<soap:operation soapAction="urn:getAvailCruises"/>
<input>
<soap:body use="encoded" namespace="urn:CruiseWS"
encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/>
</input>
<output>
<soap:body use="encoded" namespace="urn:CruiseWS"
encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/>
</output>
</operation>
<operation name="getCruise">
<soap:operation soapAction="urn:getCruise"/>
<input>
<soap:body use="encoded" namespace="urn:CruiseWS"
encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/>
</input>
<output>
<soap:body use="encoded" namespace="urn:CruiseWS"
encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/>
</output>
</operation>
</binding>
<service name="CruiseWS">
<documentation>todo</documentation>
<port name="CruiseWSPort" binding="tns:CruiseWSBinding">
<soap:address
location="http://localhost:7001/web-services/CruiseWSuri"/>
</port>
</service>
</definitions>
SOAP Request:
POST /web-services/CruiseWSuri HTTP/1.0 Content-Length: 497 Host: localhost
Content-Type: text/xml; charset=utf-8 SOAPAction: "urn:getCruise"
<?xml version="1.0" encoding="UTF-8"?>
<SOAP-ENV:Envelope SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"
xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/">
<SOAP-ENV:Body>
<ns1:getCruise xmlns:ns1="urn:CruiseWS">
<arg0 xsi:type="xsd:int">1</arg0>
</ns1:getCruise>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>
SOAP Response:
HTTP/1.0 200 OK Date: Fri, 19 Apr 2002 17:39:24 GMT Server: WebLogic WebLogic Server
6.1 SP1 09/18/2001 14:28:44 #138716 Content-Type: text/xml; charset=UTF-8
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/1999/XMLSchema-instance"
xmlns:xsd="http://www.w3.org/1999/XMLSchema">
<SOAP-ENV:Body>
<ns0:getCruiseResponse xmlns:ns0="urn:local"
SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">
<ns0:return xsi:type="bean:CruiseVO"
xmlns:bean="java:com.companyname.booking.cruise.ejb">
<briefDesc xsi:type="xsd:string">This is a budget 2
day cruise around the coast line of Alaska.</briefDesc>
<label xsi:type="xsd:string">ALASKAN SUNSHINE</label>
<cruiseRouteVOArr xsi:type="SOAP-ENC:Array"
xmlns:bean="java:com.companyname.booking.cruise.ejb"
SOAP-ENC:arrayType="bean:CruiseRouteVO[2]">
<item xsi:type="bean:CruiseRouteVO"
xmlns:bean="java:com.companyname.booking.cruise.ejb">
<arriveTime
xsi:type="xsd:string">2002-02-21 00:00:00.0</arriveTime>
<arriveCity
xsi:type="xsd:string">Kodiak</arriveCity>
<cruiseNum
xsi:type="xsd:int">1</cruiseNum>
<departTime
xsi:type="xsd:string">2002-01-21 00:00:00.0</departTime>
<routeNum
xsi:type="xsd:int">1</routeNum>
<departCity
xsi:type="xsd:string">Anchorage </departCity>
</item>
<item xsi:type="bean:CruiseRouteVO"
xmlns:bean="java:com.companyname.booking.cruise.ejb">
<arriveTime
xsi:type="xsd:string">2002-04-21 00:00:00.0</arriveTime>
<arriveCity
xsi:type="xsd:string">Another city</arriveCity>
<cruiseNum
xsi:type="xsd:int">1</cruiseNum>
<departTime
xsi:type="xsd:string">2002-03-21 00:00:00.0</departTime>
<routeNum
xsi:type="xsd:int">2</routeNum>
<departCity
xsi:type="xsd:string">Kodiak</departCity>
</item>
</cruiseRouteVOArr>
<costPp xsi:type="xsd:int">299</costPp>
<cruiseNum xsi:type="xsd:int">1</cruiseNum>
<costPc xsi:type="xsd:int">500</costPc>
</ns0:return>
</ns0:getCruiseResponse>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>
Johnny Klopper
Software Engineer
NEORIS USA
4055 International Plaza, Suite 600
Fort Worth, TX 76109
Tel.: (1-817) 731-0995 x264
[EMAIL PROTECTED] <mailto:[EMAIL PROTECTED]>
www.neoris.com/usa <http://www.neoris.com/usa>