我正在尝试在 Spring 4.0 Web 应用程序中实现以下 Websockets 示例:
http://spring.io/guides/gs/messaging-stomp-websocket/
我有以下配置文件:
import org.springframework.context.annotation.Configuration;
import org.springframework.messaging.simp.config.MessageBrokerRegistry;
import org.springframework.web.socket.config.annotation.AbstractWebSocketMessageBrokerConfigurer;
import org.springframework.web.socket.config.annotation.EnableWebSocketMessageBroker;
import org.springframework.web.socket.config.annotation.StompEndpointRegistry;
@Configuration
@EnableWebSocketMessageBroker
public class WebSocketConfig extends AbstractWebSocketMessageBrokerConfigurer {
@Override
public void configureMessageBroker(MessageBrokerRegistry config) {
config.enableSimpleBroker("/");
config.setApplicationDestinationPrefixes("/");
}
@Override
public void registerStompEndpoints(StompEndpointRegistry registry) {
registry.addEndpoint("/socket/init").withSockJS();
}
}
这是我在客户端上使用的带有 SockJS 和 Stomp.js 的 JavaScript:
var stompClient = null;
var socket = new SockJS('/HR/socket/init');
stompClient = Stomp.over(socket);
stompClient.connect({}, function(frame) {
console.log('Connected: ' + frame);
stompClient.send("/HR/get/staff", {}, JSON.stringify({ 'country': 'United Kingdom', 'city': 'London' }));
stompClient.subscribe('/HR/new/staff', function(message){
console.log(message);
});
});
创建套接字连接后,我收到一个类转换异常,如下所示:
java.lang.ClassCastException: org.apache.tomcat.websocket.server.WsServerContainer cannot be cast to javax.websocket.server.ServerContainer
我在另一个 StackOverflow 问题上看到了同样的问题,不幸的是,该解决方案没有解决我的问题,因为我的 build.gradle 文件中没有包含 javax.websocket-api。我试过包括它和排除它,我得到了同样的错误。我正在使用 Tomcat 8.0.14。
注意:完全相同的代码库已经在 Tomcat 7 上使用 Java 7 进行了测试,并且可以正常工作。当我切换到 Java 8 并在 Tomcat 8 上运行它时,我得到了上面的异常。