2015-02-05 186 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!