You are viewing a plain text version of this content. The canonical link for it is here.
Posted to java-user@axis.apache.org by "Sullivan, Mark E" <Ma...@nav-international.com> on 2002/08/13 21:27:41 UTC

JavaMSG provider bug?

using the following code with the message provider causes a
NullPointerException:

public Element[] SubmitInvoice(Vector elems) {

 Element[] response = new Element[2];
	 
	  try { 
			response[0] = new
SOAPBodyElement(XMLUtils.StringToElement("","Status",
"ACCEPTED!")).getAsDOM();
	  } catch (Exception e){
		  log.error(e.getMessage());
	//  throw AxisFault.makeFault(e);
	  }	
	  return response;

}

notice that response is being declared as a vector of size two, but i'm only
using the first position. This causes the following exception:


  <?xml version="1.0" encoding="UTF-8" ?> 
- <SOAP-ENV:Envelope
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">
- <SOAP-ENV:Body>
- <SOAP-ENV:Fault>
  <faultcode
xmlns:ns1="http://xml.apache.org/axis/">ns1:Server.userException</faultcode>

  <faultstring>java.lang.NullPointerException</faultstring> 
- <detail>
  <ns2:stackTrace
xmlns:ns2="http://xml.apache.org/axis/">java.lang.NullPointerException at
org.apache.axis.message.MessageElement.<init>(MessageElement.java(Compiled
Code)) at
org.apache.axis.message.SOAPBodyElement.<init>(SOAPBodyElement.java(Compiled
Code)) at
org.apache.axis.providers.java.MsgProvider.processMessage(MsgProvider.java(C
ompiled Code)) at
org.apache.axis.providers.java.JavaProvider.invoke(JavaProvider.java:262) at
org.apache.axis.strategies.InvocationStrategy.visit(InvocationStrategy.java:
71) at org.apache.axis.SimpleChain.doVisiting(SimpleChain.java(Compiled
Code)) at org.apache.axis.SimpleChain.invoke(SimpleChain.java:121) at
org.apache.axis.server.AxisServer.invoke(AxisServer.java:288) at
org.apache.axis.transport.http.AxisServlet.doPost(AxisServlet.java:576) 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(ApplicationFilterCh
ain.java:193) at
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.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.apache.catalina.core.StandardPipeline.invokeNext(StandardPipeline.java:5
66) 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.ContainerBase.invoke(ContainerBase.java:943) at
org.apache.catalina.connector.http.HttpProcessor.process(HttpProcessor.java(
Compiled Code)) at
org.apache.catalina.connector.http.HttpProcessor.run(HttpProcessor.java(Comp
iled Code)) at java.lang.Thread.run(Thread.java:498)</ns2:stackTrace> 
  </detail>
  </SOAP-ENV:Fault>
  </SOAP-ENV:Body>
  </SOAP-ENV:Envelope>

which is pretty cryptic to debug considering there is no mention of the
actual service class in which that method is called. If you declare the
vector as only having one element, then there is no error. I realize that
this isn't necessarily a bug, but it maybe should check before it creates
the new SOAPBodyElement.

Here's a code snippet from
org.apache.axis.providers.java.MsgProvider.processMessage:

    // We know we have one param.  OK, is it a Vector?
            if (params[0] == Vector.class) {
                // Yes, invoke away!
                argObjects[0] = bodies ;
                Element[] result = (Element[]) method.invoke( obj,
argObjects );
                if ( result != null ) {
                    for ( int i = 0 ; i < result.length ; i++ )
                        resEnv.addBodyElement( new
SOAPBodyElement(result[i]));
                }
                return ;


which should probably be changed to 

		  if ( result != null ) {
                    for ( int i = 0 ; i < result.length ; i++ ){
				** if(result[i] != null) **
                        	resEnv.addBodyElement( new
SOAPBodyElement(result[i]));
			  }
                }
                return ;


or something along those lines.