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 进行了测试,行为相同。
你有什么解决办法吗?
非常非常感谢!
Appleman1234 指向一个非常有用的错误报告。见 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!
我很难让我的应用程序达到 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 进行了测试,行为相同。
你有什么解决办法吗?
非常非常感谢!
Appleman1234 指向一个非常有用的错误报告。见 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!