I got this working by changing ServerContainerProvider#getServerContainer() to be public, per the spec. I submitted bug 54671 with patch.
However, I do still have the original question: Will I always need to use a listener to add my endpoints programmatically like I did below? Or will Tomcat eventually scan for endpoints? The examples downloadable from the GlassFish project "just work" ... there is no listener or call to ServerContainerProvider.getServerContainer(). Not sure if that's GlassFish doing something special that's not in the spec, or if the Tomcat implementation just doesn't have this feature yet. N On Mar 11, 2013, at 4:59 PM, Nick Williams wrote: > I'm trying to create what I thought was a very simple WebSocket example, but > boy have I had difficulties… > > I started by basically coping the EchoAnnotation example from the Tomcat > examples. However, it was like my endpoint was never getting instantiated. > (Is this temporary? Will Tomcat 8 ultimately scan for and instantiate these > endpoints? Or will the server container always have to be created manually?) > > I then noticed the listener that the examples application was using to > initialize the container and add the endpoints. I didn't want to tie my > example to the Tomcat classes, so I tried to do it a bit more generically > based on the WebSocket API. Below you will find the listener I created. It > compiles just fine, but on deployment I get the very unusual error further > down. What's up with this? Is this just an example of Tomcat being behind the > RC1 API? > > import javax.servlet.ServletContextEvent; > import javax.servlet.ServletContextListener; > import javax.servlet.annotation.WebListener; > import javax.websocket.server.ServerContainer; > import javax.websocket.server.ServerContainerProvider; > > @WebListener > public class WebSocketInitializerListener implements ServletContextListener > { > @Override > public void contextInitialized(ServletContextEvent servletContextEvent) > { > try > { > ServerContainer container = > ServerContainerProvider.getServerContainer(); > container.addEndpoint(EchoEndpoint.class); > } > catch (Exception e) > { > System.err.println(e.toString()); > e.printStackTrace(System.err); > throw new RuntimeException("Could not start WebSocket container."); > } > } > > @Override > public void contextDestroyed(ServletContextEvent servletContextEvent) > { > > } > } > > SEVERE: Exception sending context initialized event to listener instance of > class com.wrox.WebSocketInitializerListener > java.lang.IllegalAccessError: tried to access method > javax.websocket.server.ServerContainerProvider.getServerContainer()Ljavax/websocket/server/ServerContainer; > from class com.wrox.WebSocketInitializerListener > at > com.wrox.WebSocketInitializerListener.contextInitialized(WebSocketInitializerListener.java:17) > at > org.apache.catalina.core.StandardContext.listenerStart(StandardContext.java:4769) > at > org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5210) > at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150) > at > org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:726) > at > org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:702) > at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:698) > at > org.apache.catalina.startup.HostConfig.manageApp(HostConfig.java:1492) > at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) > at > sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) > at > sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) > at java.lang.reflect.Method.invoke(Method.java:487) > at > org.apache.tomcat.util.modeler.BaseModelMBean.invoke(BaseModelMBean.java:300) > at > com.sun.jmx.interceptor.DefaultMBeanServerInterceptor.invoke(DefaultMBeanServerInterceptor.java:819) > at > com.sun.jmx.mbeanserver.JmxMBeanServer.invoke(JmxMBeanServer.java:791) > at > org.apache.catalina.mbeans.MBeanFactory.createStandardContext(MBeanFactory.java:468) > at > org.apache.catalina.mbeans.MBeanFactory.createStandardContext(MBeanFactory.java:415) > at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) > at > sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) > at > sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) > at java.lang.reflect.Method.invoke(Method.java:487) > at > org.apache.tomcat.util.modeler.BaseModelMBean.invoke(BaseModelMBean.java:300) > at > com.sun.jmx.interceptor.DefaultMBeanServerInterceptor.invoke(DefaultMBeanServerInterceptor.java:819) > at > com.sun.jmx.mbeanserver.JmxMBeanServer.invoke(JmxMBeanServer.java:791) > at > javax.management.remote.rmi.RMIConnectionImpl.doOperation(RMIConnectionImpl.java:1465) > at > javax.management.remote.rmi.RMIConnectionImpl.access$300(RMIConnectionImpl.java:75) > at > javax.management.remote.rmi.RMIConnectionImpl$PrivilegedOperation.run(RMIConnectionImpl.java:1306) > at > javax.management.remote.rmi.RMIConnectionImpl.doPrivilegedOperation(RMIConnectionImpl.java:1398) > at > javax.management.remote.rmi.RMIConnectionImpl.invoke(RMIConnectionImpl.java:827) > at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) > at > sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) > at > sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) > at java.lang.reflect.Method.invoke(Method.java:487) > at sun.rmi.server.UnicastServerRef.dispatch(UnicastServerRef.java:322) > at sun.rmi.transport.Transport$1.run(Transport.java:177) > at sun.rmi.transport.Transport$1.run(Transport.java:174) > at java.security.AccessController.doPrivileged(Native Method) > at sun.rmi.transport.Transport.serviceCall(Transport.java:173) > at > sun.rmi.transport.tcp.TCPTransport.handleMessages(TCPTransport.java:556) > at > sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run0(TCPTransport.java:811) > at > sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run(TCPTransport.java:670) > at > java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1110) > at > java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:603) > at java.lang.Thread.run(Thread.java:722) --------------------------------------------------------------------- To unsubscribe, e-mail: users-unsubscr...@tomcat.apache.org For additional commands, e-mail: users-h...@tomcat.apache.org