Well,
org.apache.axis.description.ServiceDesc$1.compare(ServiceDesc.java:491) to
be precise...
I've got an Axis installation that provides a Web Service interface to some
software components behind the scenes. These software components are
dynamic, in that they can be updated. At run time new ServiceDescs are
created whenever my Provider is called, kicked off within initServiceDesc.
Everything works fine first time, however if I update my components, which
then kicks off another round of creating new OperationDescs, calling them
through Axis causes a NullPointer. Here's the stack trace:
{http://xml.apache.org/axis/}stackTrace:
java.lang.NullPointerException
at
org.apache.axis.description.ServiceDesc$1.compare(ServiceDesc.java:491)
at java.util.Arrays.mergeSort(Arrays.java:1241)
at java.util.Arrays.sort(Arrays.java:1188)
at java.util.Collections.sort(Collections.java:153)
at
org.apache.axis.description.ServiceDesc.getOperationsByQName(ServiceDesc.jav
a:485)
at
org.apache.axis.MessageContext.getPossibleOperationsByQName(MessageContext.j
ava:260)
at
org.apache.axis.message.BodyBuilder.onStartChild(BodyBuilder.java:175)
at
org.apache.axis.encoding.DeserializationContextImpl.startElement(Deserializa
tionContextImpl.java:963)
at
org.apache.xerces.parsers.AbstractSAXParser.startElement(AbstractSAXParser.j
ava:454)
at
org.apache.xerces.parsers.AbstractXMLDocumentParser.emptyElement(AbstractXML
DocumentParser.java:217)
at
org.apache.xerces.impl.XMLNamespaceBinder.handleStartElement(XMLNamespaceBin
der.java:873)
at
org.apache.xerces.impl.XMLNamespaceBinder.emptyElement(XMLNamespaceBinder.ja
va:590)
at
org.apache.xerces.impl.dtd.XMLDTDValidator.emptyElement(XMLDTDValidator.java
:777)
at
org.apache.xerces.impl.XMLDocumentFragmentScannerImpl.scanStartElement(XMLDo
cumentFragmentScannerImpl.java:748)
at
org.apache.xerces.impl.XMLDocumentFragmentScannerImpl$FragmentContentDispatc
her.dispatch(XMLDocumentFragmentScannerImpl.java:1453)
at
org.apache.xerces.impl.XMLDocumentFragmentScannerImpl.scanDocument(XMLDocume
ntFragmentScannerImpl.java:333)
at
org.apache.xerces.parsers.DTDConfiguration.parse(DTDConfiguration.java:524)
at
org.apache.xerces.parsers.DTDConfiguration.parse(DTDConfiguration.java:580)
at org.apache.xerces.parsers.XMLParser.parse(XMLParser.java:152)
at
org.apache.xerces.parsers.AbstractSAXParser.parse(AbstractSAXParser.java:116
9)
at javax.xml.parsers.SAXParser.parse(SAXParser.java:345)
at
org.apache.axis.encoding.DeserializationContextImpl.parse(DeserializationCon
textImpl.java:242)
at org.apache.axis.SOAPPart.getAsSOAPEnvelope(SOAPPart.java:538)
at org.apache.axis.Message.getSOAPEnvelope(Message.java:376)
at org.apache.axis.server.AxisServer.invoke(AxisServer.java:318)
at
org.apache.axis.transport.http.AxisServlet.doPost(AxisServlet.java:854)
at
net.enigmatec.rif.ws.axis.RIFAxisServlet.doPost(RIFAxisServlet.java:84)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:760)
at
org.apache.axis.transport.http.AxisServletBase.service(AxisServletBase.java:
339)
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:260)
at
org.apache.catalina.core.StandardPipeline$StandardPipelineValveContext.invok
eNext(StandardPipeline.java:643)
at
org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:480)
at
org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:995)
at
org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.ja
va:191)
at
org.apache.catalina.core.StandardPipeline$StandardPipelineValveContext.invok
eNext(StandardPipeline.java:643)
at
org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:480)
at
org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:995)
at
org.apache.catalina.core.StandardContext.invoke(StandardContext.java:2396)
at
org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:180
)
at
org.apache.catalina.core.StandardPipeline$StandardPipelineValveContext.invok
eNext(StandardPipeline.java:643)
at
org.apache.catalina.valves.ErrorDispatcherValve.invoke(ErrorDispatcherValve.
java:170)
at
org.apache.catalina.core.StandardPipeline$StandardPipelineValveContext.invok
eNext(StandardPipeline.java:641)
at
org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:172
)
at
org.apache.catalina.core.StandardPipeline$StandardPipelineValveContext.invok
eNext(StandardPipeline.java:641)
at
org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:480)
at
org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:995)
at
org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java
:174)
at
org.apache.catalina.core.StandardPipeline$StandardPipelineValveContext.invok
eNext(StandardPipeline.java:643)
at
org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:480)
at
org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:995)
at
org.apache.coyote.tomcat4.CoyoteAdapter.service(CoyoteAdapter.java:223)
at
org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:405)
at
org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.processConne
ction(Http11Protocol.java:380)
at
org.apache.tomcat.util.net.TcpWorkerThread.runIt(PoolTcpEndpoint.java:508)
at
org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.jav
a:533)
at java.lang.Thread.run(Thread.java:536)
The code here is:
getSyncedOperationsForName(implClass,
((OperationDesc)overloads.get(0)).getName());
// Sort the overloads by number of arguments - prevents us calling
methods
// with more parameters than supplied in the request (with missing
parameters
// defaulted to null) when a perfectly good method exists with
exactly the
// supplied parameters.
Collections.sort(overloads,
new Comparator() {
public int compare(Object o1, Object o2)
{
Method meth1 = ((OperationDesc)o1).getMethod();
Method meth2 = ((OperationDesc)o2).getMethod();
Line 491!>>> return (meth1.getParameterTypes().length -
meth2.getParameterTypes().length);
}
});
So somehow either the Method is null, or the parameter types are. I was
wondering if anyone knew how this state could come about? I reckon I must be
creating the OperationDesc or ServiceDescs incorrectly, although outputting
them one by one shows no difference between invocations (at least through
toString()). I noted both when it worked and when it didn't, method was
"null".
I realise this is probably quite vague, so any kind of pointer would be
helpful!
Many thanks, Dan