This turns out to be a bug in VectorSerializer, it never checks / de-references the hrefs. I've attached a patch.
John, one final tweak you'll need to your pocketSOAP client code, is when setting the brand property, to wrap the values in a CLng call, as the Apache end doesn't do type promotions. e.g. brandMasterValue.Nodes.Create "brand", Clng(1) this will force the serialized value to be typed as xsd:int, matching what the bean deserializer is expecting. Cheers Simon www.pocketsoap.com On Thu, 17 Jan 2002 16:30:56 -0500, in soap you wrote: >I'm writing a SOAP service using ApacheSOAP 2.2 that is communicating with a >PocketPC client. The pocket PC is using PocketSOAP www.pocketSOAP.com to >generate the following request: > > >POST /soap/servlet/rpcrouter HTTP/1.0 >Content-Type: text/xml; charset=UTF-8 >Accept-Charset: UTF-8, UTF-16 >User-Agent: pocketSOAP/1.2.1 >Host: 10.2.32.46:8080 >Content-Length: 1049 >SOAPAction: > ><S:Envelope > S:encodingStyle='http://schemas.xmlsoap.org/soap/encoding/' > xmlns:E='http://schemas.xmlsoap.org/soap/encoding/' > xmlns:S='http://schemas.xmlsoap.org/soap/envelope/' > xmlns:c='http://www.w3.org/2001/XMLSchema' > xmlns:b='http://www.w3.org/2001/XMLSchema-instance' > xmlns:a='urn:BrandMasterService'> ><S:Body><a:putBrandMasterValues><Vector href='#23333c'/> ></a:putBrandMasterValues> ><a:BrandMasterValue E:root='0' id='233dd4' >b:type='a:BrandMasterValue'><brand b:type='c:short'>2</brand> ><brandDescShort b:type='c:string'>SHORT2</brandDescShort> ><brandDescLong b:type='c:string'>LONG2</brandDescLong> ></a:BrandMasterValue> ><a:BrandMasterValue E:root='0' id='23365c' >b:type='a:BrandMasterValue'><brand b:type='c:short'>1</brand> ><brandDescShort b:type='c:string'>SHORT1</brandDescShort> ><brandDescLong b:type='c:string'>LONG1</brandDescLong> ></a:BrandMasterValue> ><a:Vector E:root='0' id='23333c' b:type='a:Vector'><BrandMasterValue >href='#23365c'/> ><BrandMasterValue href='#233dd4'/> ></a:Vector> ></S:Body></S:Envelope> > > >Apache states that it couldn't find the MIME attachment: > > > >HTTP/1.1 500 Internal Server Error >Date: Thu, 17 Jan 2002 21:19:06 GMT >Server: Oracle9iAS (1.0.2.2) Containers for J2EE >Content-Length: 542 >Set-Cookie: JSESSIONID=NJJPLKNFELII; Path=/ >Cache-Control: private >Connection: Close >Content-Type: text/xml; charset=utf-8 > ><?xml version='1.0' encoding='UTF-8'?> ><SOAP-ENV:Envelope >xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" >xmlns:xsi="http://www.w3.org/1999/XMLSchema-instance" >xmlns:xsd="http://www.w3.org/1999/XMLSchema"> ><SOAP-ENV:Body> ><SOAP-ENV:Fault> ><faultcode>SOAP-ENV:Client</faultcode> ><faultstring>Attachment tag "BrandMasterValue" refers to a Mime attachment >with label "#23365c" which could not be found.</faultstring> ><faultactor>/soap/servlet/rpcrouter</faultactor> ></SOAP-ENV:Fault> > ></SOAP-ENV:Body> ></SOAP-ENV:Envelope> > > >Any help would be appreciated, > >John
Index: VectorSerializer.java =================================================================== RCS file: /home/cvspublic/xml-soap/java/src/org/apache/soap/encoding/soapenc/VectorSerializer.java,v retrieving revision 1.7 diff -u -r1.7 VectorSerializer.java --- VectorSerializer.java 6 Sep 2001 20:34:17 -0000 1.7 +++ VectorSerializer.java 18 Jan 2002 05:15:00 -0000 @@ -180,11 +180,24 @@ String actualEncStyle = declEncStyle != null ? declEncStyle : inScopeEncStyle; - QName declItemType = SoapEncUtils.getTypeQName(tempEl); + + // If it's a local reference, follow it. + String href = tempEl.getAttribute(Constants.ATTR_REFERENCE); + Element actualEl = tempEl; + if(href != null && !href.equals("") && (href.charAt(0) == '#')) + { + href = href.substring(1); + actualEl = +DOMUtils.getElementByID(src.getOwnerDocument().getDocumentElement(),href); + if (actualEl == null) { + throw new IllegalArgumentException("No such ID '" + href + "'"); + } + } + + QName declItemType = SoapEncUtils.getTypeQName(actualEl); QName actualItemType = declItemType; - Bean itemBean = xjmr.unmarshall(actualEncStyle, actualItemType, - tempEl, ctx); + Bean itemBean = xjmr.unmarshall(actualEncStyle, actualItemType, + actualEl, ctx); v.addElement(itemBean.value);