[ https://issues.apache.org/jira/browse/GERONIMO-2921?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]
Jeff Genender closed GERONIMO-2921. ----------------------------------- Resolution: Fixed Fix Version/s: 2.0-beta2 Ok...here is the story... Tomcat does it's own parsing of web.xml. I tried to manually push wrappers (Servlets) and patterns to the context, but this is not working. In debugging Tomcat, apparently the url patterns don't get placed at the appropriate level when the context is running. I don't know if this is a bug or not, but it certainly is not following the architecture for the embedded/.manual tomcat component building as shown in examples all over the place. The issue may be that the context is already started. Therefore, I am writing out the XML to the deployment dir if a web.xml does not exist. This is kind of a kludge because of the Tomcat explained above. Hence, creating and writing out a web.xml to the deployed location is the only way around this until Tomcat fixes that bug. Once/if Tomcat can allow a how deploy of a servlet and url-pattern mapping to get picked up and dispatched, I can do a cleaner implementation with pure objects, thus removing the need to write out a web.xml. But for now, this seems to work. Committed revision 514188. > Tomcat does not register web service url mappings when web.xml is not present > ----------------------------------------------------------------------------- > > Key: GERONIMO-2921 > URL: https://issues.apache.org/jira/browse/GERONIMO-2921 > Project: Geronimo > Issue Type: Bug > Security Level: public(Regular issues) > Components: Tomcat > Reporter: Jarek Gawor > Assigned To: Jeff Genender > Fix For: 2.0-beta2 > > Attachments: jaxws-war-2.0-SNAPSHOT.war > > > Here's some background info. The web.xml file is now optional for JAX-WS > POJO web services. In such cases, there are certain rules on how the web.xml > should get updated. That is, appropriate <servlet> and <servlet-mapping> > elements should be inserted into the web.xml. When I update the in-memory > representation of the web.xml with the appropriate entires, everything works > just fine on Jetty. However, with Tomcat, it seems like the url-mappings for > the web services do not get registered. Everything else is fine, e.g. the web > services gbeans get initialized, etc. and I can access a JSP deployed in the > same war as the web services. > After a bit of debugging I see that GeronimoStandardContext.addChild() is not > called if the web.xml file is not present even though the in-memory > representation of the DD is updated correctly. So somehow I think the > in-memory representation of the DD is not being passed around correctly. > Here's a stack trace when web.xml file is present and when addChild() is > called: > System Thread [RMI TCP Connection(9)-192.168.1.102] (Suspended (breakpoint at > line 217 in GeronimoStandardContext)) > GeronimoStandardContext.addChild(Container) line: 217 > GeneratedMethodAccessor201.invoke(Object, Object[]) line: not available > DelegatingMethodAccessorImpl.invoke(Object, Object[]) line: 25 > Method.invoke(Object, Object...) line: 585 > IntrospectionUtils.callMethod1(Object, String, Object, String, > ClassLoader) line: 899 > SetNextRule.end() line: 193 > SetNextRule(Rule).end(String, String) line: 229 > Digester.endElement(String, String, String) line: 1058 > SAXParserImpl$JAXPSAXParser(AbstractSAXParser).endElement(QName, > Augmentations) line: not available > XMLDocumentScannerImpl(XMLDocumentFragmentScannerImpl).scanEndElement() > line: not available [local variables unavailable] > > XMLDocumentScannerImpl$ContentDispatcher(XMLDocumentFragmentScannerImpl$FragmentContentDispatcher).dispatch(boolean) > line: not available > > XMLDocumentScannerImpl(XMLDocumentFragmentScannerImpl).scanDocument(boolean) > line: not available > XIncludeAwareParserConfiguration(XML11Configuration).parse(boolean) > line: not available > > XIncludeAwareParserConfiguration(XML11Configuration).parse(XMLInputSource) > line: not available > SAXParserImpl$JAXPSAXParser(XMLParser).parse(XMLInputSource) line: not > available > SAXParserImpl$JAXPSAXParser(AbstractSAXParser).parse(InputSource) line: > not available > SAXParserImpl$JAXPSAXParser.parse(InputSource) line: not available > Digester.parse(InputSource) line: 1562 > ContextConfig.applicationWebConfig() line: 369 > ContextConfig.start() line: 1060 > ContextConfig.lifecycleEvent(LifecycleEvent) line: 261 > LifecycleSupport.fireLifecycleEvent(String, Object) line: 120 > GeronimoStandardContext(StandardContext).start() line: 4238 > GeronimoStandardContext.access$201(GeronimoStandardContext) line: 66 > GeronimoStandardContext$SystemMethodValve.invoke(Request, Response) > line: 334 > GeronimoBeforeAfterValve.invoke(Request, Response) line: 47 > GeronimoStandardContext.start() line: 189 > StandardHost(ContainerBase).addChildInternal(Container) line: 760 > StandardHost(ContainerBase).addChild(Container) line: 740 > StandardHost.addChild(Container) line: 525 > TomcatContainer.addContext(TomcatContext) line: 331 > TomcatContainer$$FastClassByCGLIB$$9370b073.invoke(int, Object, > Object[]) line: not available > FastMethod.invoke(Object, Object[]) line: 53 > FastMethodInvoker.invoke(Object, Object[]) line: 38 > GBeanOperation.invoke(Object, Object[]) line: 127 > GBeanInstance.invoke(int, Object[]) line: 820 > RawInvoker.invoke(int, Object[]) line: 57 > RawOperationInvoker.invoke(AbstractName, Object[]) line: 35 > ProxyMethodInterceptor.intercept(Object, Method, Object[], MethodProxy) > line: 96 > TomcatContainer$$EnhancerByCGLIB$$d873f7e2.addContext(TomcatContext) > line: not available > TomcatWebAppContext.doStart() line: 496 > GBeanInstance.createInstance() line: 986 > GBeanInstanceState.attemptFullStart() line: 267 > GBeanInstanceState.start() line: 102 > GBeanInstance.start() line: 529 > GBeanDependency.attemptFullStart() line: 111 > GBeanDependency.addTarget(AbstractName) line: 146 > GBeanDependency$1.running(AbstractName) line: 120 > BasicLifecycleMonitor.fireRunningEvent(AbstractName) line: 173 > BasicLifecycleMonitor.access$300(BasicLifecycleMonitor, AbstractName) > line: 41 > BasicLifecycleMonitor$RawLifecycleBroadcaster.fireRunningEvent() line: > 251 > GBeanInstanceState.attemptFullStart() line: 292 > GBeanInstanceState.start() line: 102 > GBeanInstanceState.startRecursive() line: 124 > GBeanInstance.startRecursive() line: 543 > BasicKernel.startRecursiveGBean(AbstractName) line: 379 > ConfigurationUtil.startConfigurationGBeans(AbstractName, Configuration, > Kernel) line: 434 > > EditableKernelConfigurationManager(KernelConfigurationManager).start(Configuration) > line: 188 > > EditableKernelConfigurationManager(SimpleConfigurationManager).startConfiguration(Artifact, > LifecycleMonitor) line: 527 > > EditableKernelConfigurationManager(SimpleConfigurationManager).startConfiguration(Artifact) > line: 508 > SimpleConfigurationManager$$FastClassByCGLIB$$ce77a924.invoke(int, > Object, Object[]) line: not available > FastMethod.invoke(Object, Object[]) line: 53 > FastMethodInvoker.invoke(Object, Object[]) line: 38 > GBeanOperation.invoke(Object, Object[]) line: 127 > GBeanInstance.invoke(String, Object[], String[]) line: 855 > BasicKernel.invoke(AbstractName, String, Object[], String[]) line: 239 > KernelGBean.invoke(AbstractName, String, Object[], String[]) line: 342 > KernelGBean$$FastClassByCGLIB$$1cccefc9.invoke(int, Object, Object[]) > line: not available > FastMethod.invoke(Object, Object[]) line: 53 > FastMethodInvoker.invoke(Object, Object[]) line: 38 > GBeanOperation.invoke(Object, Object[]) line: 127 > GBeanInstance.invoke(String, Object[], String[]) line: 855 > BasicKernel.invoke(AbstractName, String, Object[], String[]) line: 239 > MBeanGBeanBridge.invoke(String, Object[], String[]) line: 168 > MetaDataImpl$PrivateDynamicMeta(DynamicMetaDataImpl).invoke(Object, > String, Object[], String[]) line: 213 > MetaDataImpl.invoke(Object, String, Object[], String[]) line: 220 > DefaultMBeanServerInterceptor.invoke(ObjectName, String, Object[], > String[]) line: 815 > JmxMBeanServer.invoke(ObjectName, String, Object[], String[]) line: 784 > RMIConnectionImpl.doOperation(int, Object[]) line: 1408 > RMIConnectionImpl.access$100(RMIConnectionImpl, int, Object[]) line: 81 > RMIConnectionImpl$PrivilegedOperation.run() line: 1245 > AccessController.doPrivileged(PrivilegedExceptionAction<T>, > AccessControlContext) line: not available [native method] > RMIConnectionImpl.doPrivilegedOperation(int, Object[], Subject) line: > 1348 > RMIConnectionImpl.invoke(ObjectName, String, MarshalledObject, > String[], Subject) line: 782 > NativeMethodAccessorImpl.invoke0(Method, Object, Object[]) line: not > available [native method] > NativeMethodAccessorImpl.invoke(Object, Object[]) line: 39 > DelegatingMethodAccessorImpl.invoke(Object, Object[]) line: 25 > Method.invoke(Object, Object...) line: 585 > UnicastServerRef2(UnicastServerRef).dispatch(Remote, RemoteCall) line: > 294 > Transport$1.run() line: 153 > AccessController.doPrivileged(PrivilegedExceptionAction<T>, > AccessControlContext) line: not available [native method] > TCPTransport(Transport).serviceCall(RemoteCall) line: 149 > TCPTransport.handleMessages(Connection, boolean) line: 466 > TCPTransport$ConnectionHandler.run() line: 707 > Thread.run() line: 595 > It looks like ContextConfig.applicationWebConfig() is (re)parsing web.xml > file but I'm not sure where it gets it from. The url its using to load the > file is: jndi:/0.0.0.0/jaxws-war-2.0-SNAPSHOT/WEB-INF/web.xml -- This message is automatically generated by JIRA. - You can reply to this email to add a comment to the issue online.