I have attached code samples to the bottom. I am resending bc I did not see my earlier message show up on the archives. I am using the following environment java 1.4 Tomcat 4.0.3 Soap 2.3 Xerces 1.4.4
I have written a simple class that implements not only the class functions, but the serialization and deserialization as well. I am having problems calling a simple function on the class that returns itself. Right now the class has only one member (a string) and thus the marshall and unmarshall functions are responsible for handling just that member. When a client calls the function, apache tomcat loads the constructor, calls the function, but never calls the marshall function (as reported through the apache console). The only thing returned to the client is Fault Code = SOAP-ENV:Server Fault String = java.lang.NullPointerException Does anyone have any ideas? I've gotten the simple soap examples to run just fine. (And subsequently my code and descriptor are pretty identical) It's pretty weird because I know that the marshall/unmarshall methods are never being accessed by the server. The exception is being thrown at (RPCJavaProvider.java:138) which seems to me that it can't find a reference to my (de)serializer. Another question: the only reference to the class GuideSerializer that is made is at the client while building the call. Is this correct? Do I need to somehow map GuideSerializer to the type Guide in the DeploymentDescriptor??? Thanks, Todd D. Johnson Implementing server class: public Guide getSampleGuide(int guideSeq){ System.out.println("Guide.getSampleGuide called"); setGuideName("Sample Tickler Guide"); //g.setGuideType("DefaultGuidePublishingAgentImpl"); System.out.println("Guide.getSampleGuide exiting"); return this; } DeploymentDescriptor: <isd:service xmlns:isd="http://xml.apache.org/xml-soap/deployment" id="urn:tickler"> <isd:provider type="java" scope="Request" methods="getSampleGuide"> <isd:java class="com.salarinc.tickler.foundation.Guide" static="false"/> </isd:provider> <isd:faultListener>org.apache.soap.server.DOMFaultListener</isd:faultListene r> <isd:mappings> <isd:map encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" xmlns:x="urn:tickler-guide" qname="x:guide" javaType="com.salarinc.tickler.foundation.Guide" java2XMLClassName="org.apache.soap.encoding.soapenc.BeanSerializer" xml2JavaClassName="org.apache.soap.encoding.soapenc.BeanSerializer"/> </isd:mappings> </isd:service> Client code: Integer x=new Integer(7); Integer y=new Integer(8); final String urn= "urn:tickler"; Vector params = new Vector(); URL url = null; try{ url = new URL("http://" + serverhost + ":" + serverport+ soapservlet); }catch(java.net.MalformedURLException e){ System.out.println("Error creating a url: "+e.getMessage()); } ServiceManagerClient client = new ServiceManagerClient(url); try{ String[] apps = client.list(); System.out.println("Deployed Services at "+url.toString()+" are:"); for(int i = 0; i < apps.length; i++){ System.out.println("\t"+apps[i]); DeploymentDescriptor desc = client.query(apps[i]); System.out.println("\t\tMethods for "+desc.getScriptFilenameOrString()+" are:"); String[] methods = desc.getMethods(); for(int j = 0; j < methods.length; j++){ System.out.println("\t\t\t"+methods[j]); } } }catch(SOAPException e){ System.out.println("Could not connect to ServiceManager at "+url.toString()+": "+e.getMessage()); } // Build the call. Call call = new Call(); SOAPHTTPConnection shc = new SOAPHTTPConnection (); shc.setMaintainSession (true); call.setSOAPTransport(shc); call.setTargetObjectURI(urn); call.setEncodingStyleURI("http://schemas.xmlsoap.org/soap/encoding/"); call.setMethodName("getSampleGuide"); params.addElement(new Parameter("guideSeq" , Integer.class, new Integer(7), null)); call.setParams(params); GuideSerializer ser_0 = new GuideSerializer(); SOAPMappingRegistry smr = call.getSOAPMappingRegistry(); smr.mapTypes("http://schemas.xmlsoap.org/soap/encoding/", new QName( "urn:tickler-guide", "guide"), Guide.class, ser_0, ser_0); call.setSOAPMappingRegistry(smr); Response resp = null; try{ resp = call.invoke(url,""); }catch(org.apache.soap.SOAPException e){ System.out.println("Got a soap exception while invoking "+e.getMessage()); System.exit(1); } if (resp.generatedFault()) { Fault fault = resp.getFault(); System.out.println("Ouch, the call failed: "); System.out.println(" Fault Code = " + fault.getFaultCode()); System.out.println(" Fault String = " + fault.getFaultString()); } else { Parameter result = resp.getReturnValue(); if(result.getType() == Guide.class){ Guide g = (Guide)result.getValue(); System.out.println("The guide name is " + g.getGuideName()); }else{ System.out.println("ERROR server returned a :"+result.getType().toString()); System.exit(1); } } Serializer/Deserializer public Bean unmarshall(String inScopeEncStyle, QName elementType, Node src, XMLJavaMappingRegistry xjmr, SOAPContext ctx) throws IllegalArgumentException { Element root = (Element)src; Element tempEl = DOMUtils.getFirstChildElement(root); Guide target; try { target = (Guide)Guide.class.newInstance (); } catch (Exception e) { throw new IllegalArgumentException("Problem instantiating bean: " + e.getMessage()); } while (tempEl != null) { Bean paramBean = xjmr.unmarshall(inScopeEncStyle, RPCConstants.Q_ELEM_PARAMETER, tempEl, ctx); Parameter param = (Parameter)paramBean.value; String tagName = tempEl.getTagName(); if (tagName.equals("name")) { target.setGuideName((java.lang.String)param.getValue()); } tempEl = DOMUtils.getNextSiblingElement(tempEl); } return new Bean(Guide.class, target); } public void marshall(String inScopeEncStyle, Class javaType, Object src, Object context, Writer sink, NSStack nsStack, XMLJavaMappingRegistry xjmr, SOAPContext ctx) throws IllegalArgumentException, IOException { nsStack.pushScope(); SoapEncUtils.generateStructureHeader(inScopeEncStyle, javaType, context, sink, nsStack, xjmr); sink.write(StringUtils.lineSeparator); Guide src2 = (Guide)src; Parameter param; param = new Parameter("namme", String.class, new String ("Test"), null); xjmr.marshall(inScopeEncStyle, Parameter.class, param, null, sink, nsStack, ctx); sink.write(StringUtils.lineSeparator); sink.write("</" + context + '>'); nsStack.popScope(); } server gunk: </SHTTP/1.1 500 Internal Server Error Content-Type: text/xml; charset=utf-8 Content-Length: 3369 Date: Mon, 10 Jun 2002 14:24:09 GMT Server: Apache Tomcat/4.0.2 (HTTP/1.1 Connector) Set-Cookie: JSESSIONID=4F9E94EB66517ADC4DEAD0E2AE6E5966;Pa<?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/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> <SOAP-ENV:Body> <SOAP-ENV:Fault> <faultcode>SOAP-ENV:Server</faultcode> <faultstring>java.lang.NullPointerException</faultstring> <faultactor>/soap/servlet/rpcrouter</faultactor> <detail> <stackTrace>[SOAPException: faultCode=SOAP-ENV:Server; msg=java.lang.NullPointerException] at org.apache.soap.providers.RPCJavaProvider.invoke(RPCJavaProvider.java:138) at org.apache.soap.server.http.RPCRouterServlet.doPost(RPCRouterServlet.java:35 4) at javax.servlet.http.HttpServlet.service(HttpServlet.java:760) at javax.servlet.http.HttpServlet.service(HttpServlet.java:853) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(Application FilterChain.java:247) at org.apache.catalina.core.ApplicationFilterChain.doFilter(Applicat org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.ja va:243) at org.apache.catalina.core.StandardPipeline.invokeNext(StandardPipeline.java:5 66) at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:472) at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:943) at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.ja va:190) at org.apache.catalina.core.StandardPipeline.invokeNext(StandardPipeline.java:5 66) at org.apache.catalina.valves.CertificatesValve.invoke(CertificatesValve.java:2 46) at org.apache.catalina.core.StandardPipeline.invokeNext(StandardPipeline.java:5 64) at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:472) at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:943) at org.apache.catalina.core.StandardContext.invoke(StandardContext.java:2343) at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:180 ) at org.ndardPipeline.invokeNext(StandardPipeline.java:566) at org.apache.catalina.valves.ErrorDispatcherValve.invoke(ErrorDispatcherValve. java:170) at org.apache.catalina.core.StandardPipeline.invokeNext(StandardPipeline.java:5 64) at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:170 ) at org.apache.catalina.core.StandardPipeline.invokeNext(StandardPipeline.java:5 64) at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:468) at org.apache.catalina.core.StandardPipeline.invokeNext(StandardPipeline.java:5 64) at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:472) at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:943) at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java :174) at org.apache.catalina.core.StandardPipeline.invokeNext(StandardPipeline.java:5 66) at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:472) at org.apache.catalina.core.CainerBase.java:943) at org.apache.catalina.connector.http.HttpProcessor.process(HttpProcessor.java: 1012) at org.apache.catalina.connector.http.HttpProcessor.run(HttpProcessor.java:1107 ) at java.lang.Thread.run(Thread.java:536) </stackTrace> </detail> </SOAP-ENV:Fault>