Tomcat 8 和 Websocket

Tomcat 8 and Websocket

我很难让我的应用程序达到 tomcat 8。我正在使用 websocket 和 spring 4 但我不想使用 spring 内部 STOMP 机制所以我决定遵循 this 教程并按照我的方式实现我的 websocket 例程。 我已经开发了几个星期,并始终使用 jetty(maven jetty 插件)对其进行测试,一切正常。但现在我想将我的应用程序部署到我们的生产服务器 运行 tomcat 8.0.15 java 8 和 CentOS,但它不工作。

这是源代码:

@WebListener
public class MyApplication implements ServletContextListener {

private final static String SERVER_CONTAINER_ATTRIBUTE = "javax.websocket.server.ServerContainer";

@Override
public void contextInitialized(ServletContextEvent sce) {

    ServletContext container = sce.getServletContext();

    final ServerContainer serverContainer = (ServerContainer) container.getAttribute(SERVER_CONTAINER_ATTRIBUTE);
    try {
        serverContainer.addEndpoint(new MyEndpointConfig(MyEndpoint.class, "/wstest"));
    } catch (DeploymentException e) {
        e.printStackTrace();
    }
}
}

这是错误:

java.lang.ClassCastException: org.apache.tomcat.websocket.server.WsServerContainer cannot be cast to javax.websocket.server.ServerContainer
at my.package.contextInitialized(MyApplication.java:23)

第 23 行是我对 ServerContainer 进行转换的地方。 我猜 "container.getAttribute(SERVER_CONTAINER_ATTRIBUTE)" returns 为空,因此转换失败,但为什么呢??

Jetty 9.2.3 一切正常。我还使用本地安装的 tomcat 8(最新的 8.0.18)和 Windows 7 上的最新 JDK 8 进行了测试,行为相同。

你有什么解决办法吗?

非常非常感谢!

A​​ppleman1234 指向一个非常有用的错误报告。见 Iyad Elian 评论:

FYI, I found why the exception happens javax.websocket-api like javax.servlet-api needs to be excluded at runtime in tomcat. jetty prefers application classloader to it's own however so it's not a problem.

<dependency>
    <groupId>javax.websocket</groupId>
    <artifactId>javax.websocket-api</artifactId>
    <version>1.0</version>
    <scope>provided</scope>
</dependency>

这就是为什么它没有在 tomcat 上工作而是在码头上工作的原因。我刚刚添加了

<scope>provided</scope>

现在一切正常。感谢 Appleman1234!