2015-02-05 221 views
1

我麻烦让我的应用程序到tomcat 8.我使用websocket和spring 4,但我不想使用春季内部STOMP机制,所以我决定遵循this教程并实施我的websocket例程是我的方式。 我现在开发几个星期了,并且总是用码头(maven码头插件)进行测试,一切正常。但是现在我想将我的应用程序部署到运行java 8和CentOS上的tomcat 8.0.15的生产服务器上,但它不起作用。Tomcat 8和Websocket

这里是源代码:

@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。我已经在Windows 7上安装了本地的tomcat 8(最新的8.0.18)和最新的JDK 8,并且测试了相同的行为。

你有什么想法如何解决这个问题?

非常感谢你!

+2

[以下错误报告](https://jira.spring.io/browse/SPR-11617)看起来相关。 – Appleman1234 2015-02-09 09:24:49

+0

是的,这非常有帮助。我发现ISSE: javax.websocket javax.websocket-API 1.0 提供 我没有在pom.xml添加所提供的范围 – mesx 2015-02-09 14:08:58

回答

1

Appleman1234指向一个非常有用的错误报告。见伊亚德·埃利安评论:

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!