Spring’s online documentation is often quite helpful when getting started with most of their frameworks. That is, you walk through the examples, quickly hit something that doesn’t work, and then grab the source code and step through it, using the docs as a navigational aid.
Such was the case today when working through the Spring Web Services tutorial. After fixing a few configuration issues, I got stuck on an exception thrown in MessageDispatcher.getEndpointAdapter:
java.lang.IllegalStateException: No adapter for endpoint […]: Is your endpoint annotated with @Endpoint, or does it implement a supported interface like MessageHandler or PayloadEndpoint?
After attaching source and debugging, I found that the JDomPayloadMethodProcessor was not in the list of the DefaultMethodEndpointAdapter‘s methodArgumentResolvers. It seems it should have been since initMethodArgumentResolvers adds it whenever org.jdom.Element is present (found by the classloader), and it was present.
Now I had never used JDOM before, but I thought I’d play along since the example used it. Besides, he who dies with the most XML frameworks wins, right? Since the example had org.jdom, I had Maven fetch it.
Upon further debugging, I found that initMethodArgumentResolvers wasn’t initializing because the list had already been set by AnnotationDrivenBeanDefinitionParser.registerEndpointAdapters. And that class was looking for org.jdom2.Element.
Doh! Those Spring developers should talk. Meanwhile, I just grabbed jdom2 and converted to it.
This debugging stint was a small price to pay for a web services framework that definitely beats Axis, Axis2, and others I’ve used. But I look forward to the day when I can use a Spring framework as a black box. Until then, I’ll keep going to the Spring Source code. And, of course, wish founder Rod all the best in his new endeavors.