Tomcat 8和Websocket

我在将应用程序添加到tomcat 8时遇到了麻烦。我正在使用websocket和spring

4,但是我不想使用spring内部的STOMP机制,所以我决定按照本教程并以我的方式实现我的websocket例程。我已经开发了两个星期,并且一直使用jetty(maven

jetty插件)对其进行测试,并且一切正常。但是现在我想将我的应用程序部署到在Java 8和CentOS上运行tomcat

8.0.15的生产服务器上,但是它不起作用。

这是源代码:

@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)”返回null,因此强制转换失败,但是为什么?

使用Jetty 9.2.3都可以正常工作。我还对它进行了测试,并安装了本地tomcat 8(最新的8.0.18)和Windows 7上的最新JDK

8,并且具有相同的性能。

您有任何解决方法的想法吗?

非常非常感谢你!

回答:

Appleman1234指向一个非常有用的错误报告。请参阅Iyad Elian评论:

仅供参考,我发现了为什么异常发生的原因像javax.servlet-api这样的javax.websocket-

api需要在运行时在tomcat中排除。jetty更喜欢应用程序类加载器,但是它不是问题。

<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 的全部内容, 来源链接: utcz.com/qa/415328.html

回到顶部