【发布时间】:2014-04-24 06:02:09
【问题描述】:
尝试使用 Spring 4 WebSocket 和 STOMP over socket 使用 sockjs。 我遇到了一个问题。
我的配置:
websocket.xml - spring 上下文的一部分
<websocket:message-broker application-destination-prefix="/app">
<websocket:stomp-endpoint path="/ws">
<websocket:sockjs/>
</websocket:stomp-endpoint>
<websocket:simple-broker prefix="/topic"/>
</websocket:message-broker>
控制器代码:
@MessageMapping("/ws")
@SendTo("/topic/ws")
public AjaxResponse hello() throws Exception {
AjaxResponse ajaxResponse = new AjaxResponse();
ajaxResponse.setSuccess(true);
ajaxResponse.addSuccessMessage("WEB SOCKET!!! HELL YEAH!");
return ajaxResponse;
}
客户端:
var socket = new SockJS("<c:url value='/ws'/>");
var stompClient = Stomp.over(socket);
stompClient.connect({}, function(frame) {
alert('Connected: ' + frame);
stompClient.send("/app/ws", {}, {});
stompClient.subscribe('/topic/ws', function(response){
alert(response.success);
});
});
输出:
Opening Web Socket... stomp.js:130
GET http://localhost:8080/ws/info 404 (Not Found) sockjs-0.3.js:807
Whoops! Lost connection to undefined stomp.js:130
我做错了什么?
我在 google 中找到了示例(TickerStocks 或类似的东西,问候应用程序(Spring 的示例)),所有这些都给了我同样的错误。我尝试使用带有握手的 WebSocket(没有 sockjs) - 结果相同)。
补充信息:
方法public AjaxResponse hello(); 放置在根上下文“/”上的IndexController 中。所以我可以提供完整路径:http://localhost:8080/ws。
部署经过测试的tomcat7和tomcat8。
【问题讨论】:
-
不是很相关,但我强烈建议您放弃使用基于 XML 的配置文件,并在全局范围内采用 JavaConfig,而不是混合和匹配。 There is a complete tutorial 使用 JavaConfig 和 sockjs 进行设置。更重要的是,您的应用程序是如何部署的?它位于网络服务器的根目录?因为您在 Javascript 中的 URL 是绝对的。
-
我可以从我的应用程序中完全删除所有 xml 配置吗?它不会降低我的应用程序的速度吗?我可以删除所有 XML 并为整个应用程序创建一个 WebConfig 吗?这个完整的教程是我在问题中提到的问候应用程序(Spring 的示例),我试过了。
-
是的,您根本不需要 any xml。它绝对不会减慢应用程序的速度——它甚至可以加快它的速度,因为您的 XML 不需要“编译”成配置代码。您只需要确保 bootstrap your application 使用根配置类即可。
-
蜘蛛鲍里斯,写一个关于删除所有 xml 的答案(包括 web.xml - 改为使用 WebInitializer)我会将其标记为答案。在此之后,我使用 websocket、sockjs 和 stomp 编写代码 - 一切正常。
标签: java spring-mvc stomp sockjs spring-websocket