If you can generate WSDL from SOAP::Lite, then Apache Axis will work better for you, because it can use the WSDL to know how to de-serialize.
If you must use Apache SOAP, then you will probably have to write a serializer. I don't know how SOAP::Lite uses 'http://xml.apache.org/xml-soap:SOAPStruct'. That the namespace of the type is 'http://xml.apache.org/xml-soap is disconcerting, as that should only be used for Vector, Map, DataHandler and other types defined by Apache SOAP. SOAPStruct is not defined by Apache SOAP. There is a SOAPStruct from the round2 interop in the namespace http://soapinterop.org/. That struct looks like Integer myInt; String myString; Float myFloat; What is the structure of the struct you are getting from SOAP::Lite? Can you post the XML payload being sent? Scott Nichol Do not send e-mail directly to this e-mail address, because it is filtered to accept only mail from specific mail lists. ----- Original Message ----- From: "Blanchard, Raphael" <[EMAIL PROTECTED]> To: <[EMAIL PROTECTED]> Sent: Wednesday, August 06, 2003 10:52 AM Subject: SOAPStruct and Apache > Hi, > I have been trying to make a Apache Soap Client for my SOAP::Lite > web service. However I run into problems with SOAPStructs returned by the > service. It seems java cannot deserialize them. I get the following error > message java.lang.IllegalArgumentException: No mapping found for > 'http://xml.apache.org/xml-soap:SOAPStruct' using encoding style > 'http://schemas.xmlsoap.org/soap/encoding/'. I've tried writting > serializers for java but without any success. Can someone please help me > with this, I'm going nuts... > > Raphael > > > > PERL WEB SERVICE USING SOAP LITE > ---------------------------------------------------------------------------- > ---------------------------------------------------------- > #!/usr/bin/perl > > use SOAP::Transport::HTTP; > use MySearch; > > > $server = SOAP::Transport::HTTP::CGI > ->dispatch_to('WS'); > ->handle; > > > exit; > > package WS; > > sub search { > my $mysearch = new MySearch; > my $hashref_params = {}; > $hashref_params->{"max_results"} = 1; > my $sql_statement = $mysearch->get_search_params($hashref_params); > my $sth = $edurss->query($sql_statement); > my (@result_array, $result_row); > while ($result_row = $sth->fetchrow_hashref()) { > foreach my $key (keys %$result_row) { > if (!$result_row->{$key}) { > %$result_row = 'null'; > } > } > > SOAP::Data->type(DomainInfo => $result_row)->name('item'); > push (@result_array, $result_row); > $test = [EMAIL PROTECTED]; > } > > return $#result_array + 1,[EMAIL PROTECTED]; > > } > > > JAVA CLIENT CODE > ---------------------------------------------------------------------------- > --------------------------- > try { > > URL url = new URL("http://myurl/bla.cgi"); > String urn = "urn:WS"; > Call call = new Call(); > call.setEncodingStyleURI(Constants.NS_URI_SOAP_ENC); > call.setTargetObjectURI(urn); > call.setMethodName("search"); > > > SOAPHTTPConnection st = new SOAPHTTPConnection(); > > > SOAPMappingRegistry smr = call.getSOAPMappingRegistry(); > BeanSerializer beanSer = new BeanSerializer(); > SOAPContext reqCtx = call.getSOAPContext(); > DocumentBuilder xdb = XMLParserUtils.getXMLDocBuilder(); > Envelope callEnv = call.buildEnvelope(); > StringWriter payloadSW = new StringWriter(); > callEnv.marshall(payloadSW, smr, reqCtx); > reqCtx.setRootPart(payloadSW.toString(), > Constants.HEADERVAL_CONTENT_TYPE); > st.send(url, "", null, null, smr, reqCtx); > SOAPContext respCtx = st.getResponseSOAPContext(); > String payloadStr = Call.getEnvelopeString(st); > System.out.println(payloadStr); > Document respDoc = xdb.parse(new InputSource(new > StringReader(payloadStr))); > Element payload = null; > if (respDoc != null) { > payload = respDoc.getDocumentElement(); > } > else { > throw new SOAPException(Constants.FAULT_CODE_CLIENT, > "Parsing error, response was:\n" + > payloadStr); > } > Envelope respEnv = Envelope.unmarshall(payload, respCtx); > Response resp = Response.extractFromEnvelope(respEnv, smr, respCtx); > Response response = resp; > > > if (response.generatedFault()) { > Fault f = response.getFault(); > JOptionPane.showMessageDialog(this,"Fault = " + f.getFaultCode() + > "," + f.getFaultString()); > > } > else { > > Parameter ret = response.getReturnValue(); > Object value = ret.getValue(); > String output = null; > if ( value != null ) > { > String[] tlist = (String[])value; > for ( int i = 0; i < tlist.length; i++ ) > output.concat(tlist[i]); > } > JOptionPane.showMessageDialog(this,"return: " + output); > } > > > } > catch (Exception ee) { > JOptionPane.showMessageDialog(this, ee); > System.out.println(ee); > tSearchString.setText(ee.toString()); > } > > > > > } > > > SOAP RESULT > ---------------------------------------------------------------------------- > ---------------------------- > <?xml version="1.0" encoding="UTF-8"?> > <SOAP-ENV:Envelope xmlns:xsi="http://www.w3.org/1999/XMLSchema-instance" > > xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/" > > xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" > xmlns:xsd="http://www.w3.org/1999/XMLSchema" > xmlns:namesp2="http://xml.apache.org/xml-soap" > > SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"> > <SOAP-ENV:Body> > <namesp1:searchResponse > xmlns:namesp1="urn:WS"> > <s-gensym3 xsi:type="xsd:int">1</s-gensym3> > <SOAP-ENC:Array xsi:type="SOAP-ENC:Array" > SOAP-ENC:arrayType="namesp2:SOAPStruct[1]"> > <item xsi:type="namesp2:SOAPStruct"> > <link xsi:type="xsd:string">NULL</link> > <feedid xsi:type="xsd:int">103</feedid> > <dc_title > xsi:type="xsd:string">NULL</dc_title> > <feed_title xsi:type="xsd:string">FOS > News</feed_title > <title xsi:type="xsd:string">New Articles on > Open Access The July issue of In ...</title> > <id xsi:type="xsd:int">17226</id> > </item> > </SOAP-ENC:Array> > </namesp1:searchResponse> > </SOAP-ENV:Body> > </SOAP-ENV:Envelope> >
