SockJS无法创建/连接到Spring WebSocket。

8

我正在学习Spring WebSocket。我已经成功地运行了这个Spring WebSocket教程。现在,我试图将其原封不动地整合到我的现有Spring MVC应用程序中。当我从Chrome浏览器运行它时,在其开发控制台中看到下面的错误。

Chrome控制台

Opening Web Socket...
GET http://localhost:8080/MyAppName/api/gs-guide-websocket/info?t=1497735312528 500 (Internal Server Error) -- abstract-xhr.js:132
Whoops! Lost connection to http://localhost:8080/MyAppName/api/gs-guide-websocket -- stomp.min.js:8 

服务器端错误

javax.servlet.ServletException: Could not resolve view with name '/MyAppName/api/gs-guide-websocket/info' in servlet with name 'MyAppName'
at org.springframework.web.servlet.DispatcherServlet.render(DispatcherServlet.java:1262)
at org.springframework.web.servlet.DispatcherServlet.processDispatchResult(DispatcherServlet.java:1037)

客户端

function connect() {
    var socket = new SockJS('/MyAppName/api/gs-guide-websocket');
    stompClient = Stomp.over(socket);
    stompClient.connect({}, function (frame) {
        setConnected(true);
        console.log('Connected: ' + frame);
        stompClient.subscribe('/topic/greetings', function (greeting) {
            showGreeting(JSON.parse(greeting.body).content);
        });
    });
}

服务器端

@Configuration
@EnableWebSocketMessageBroker
public class WebSocketConfig extends AbstractWebSocketMessageBrokerConfigurer {

    @Override
    public void configureMessageBroker(MessageBrokerRegistry config) {
        config.enableSimpleBroker("/topic");
        config.setApplicationDestinationPrefixes("/app");
    }

    @Override
    public void registerStompEndpoints(StompEndpointRegistry registry) {
        registry.addEndpoint("/MyAppName/api/gs-guide-websocket").withSockJS();
    }

}

我已经尝试解决这个问题几个小时了。我该怎么解决?

谢谢。


1
你解决了吗?我也遇到了同样的问题... - Juan
2个回答

0
如果您的应用程序上下文是MyAppName,则不需要在addEndpoint方法中指定它-此路径相对于您的应用程序上下文。
可能registry.addEndpoint("/MyAppName/api/gs-guide-websocket")会将路径为/MyAppName/MyAppName/api/gs-guide-websocket的端点注册。

0

也许,我的示例可以提示问题

我的应用程序基本URL http://localhost:8080/socket/

我的js文件

function connect() {
    var socket = new SockJS('/socket/greeting');
    stompClient = Stomp.over(socket);

    stompClient.connect({name: 'test'}, function(frame) {
        
        console.log("session Id:" + socket._transport.url); 
        console.log("user Id:" + socket.current_user_id);
        console.log("socket Id:" + stompClient.id);
        var sessionId = /\/([^\/]+)\/websocket/.exec(socket._transport.url)[1];
        $("#fname").val(sessionId);
        console.log("socket Id:" + sessionId);
        stompClient.subscribe("/user/queue/errors", function(message) {
            alert("Error " + message.body);
        });

        stompClient.subscribe("/user/queue/reply", function(message) {
            showGreeting(message.body);
        });
    }, function(error) {
        alert("STOMP error " + error);
    });
}

我的套接字配置
package com.connectips.socket.config;

import org.springframework.context.annotation.Configuration;
import org.springframework.messaging.simp.config.MessageBrokerRegistry;
import org.springframework.web.socket.config.annotation.EnableWebSocketMessageBroker;
import org.springframework.web.socket.config.annotation.StompEndpointRegistry;
import org.springframework.web.socket.config.annotation.WebSocketMessageBrokerConfigurer;

import com.connectips.socket.interceptor.HttpHandshakeInterceptor;

@Configuration
@EnableWebSocketMessageBroker
public class SocketConfig implements WebSocketMessageBrokerConfigurer{

    @Override
    public void configureMessageBroker(MessageBrokerRegistry config) {
        config.enableSimpleBroker("/topic/", "/queue/");
        config.setApplicationDestinationPrefixes("/app");
    }

    @Override
    public void registerStompEndpoints(StompEndpointRegistry registry) {
        registry.addEndpoint("/greeting").addInterceptors(new HttpHandshakeInterceptor()).withSockJS();
    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接