java - Spring WebSocket MessageMapping 不起作用

标签 java websocket stomp java-websocket spring-messaging

我需要写聊天。但是我有一个问题,我无法触发MessageMapping controller .应用程序包含两部分,前端运行于 4200 端口 和运行在 上的后端8080端口 .我已经设置了所有的配置,但是@MessageMapping controller没有被触发。后端控制台什么也没说。但是浏览器控制台说,该消息已发送。你能帮我解决吗?这里是哈瓦配置。

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

@Override
public void registerStompEndpoints(StompEndpointRegistry registry) {
    registry.addEndpoint("/chat").setAllowedOrigins("*").withSockJS();
}

这是 Controller
@Controller
public class MessageController {


@MessageMapping("/chat")
@SendTo("/topic/message")
public void sendMessage(Message message) {
    System.out.println("test");
}

以及写在 angular 上的前端部分:
(function (angular, SockJS, Stomp, _, undefined) {
"use strict";

angular.module("app").
factory("chatService", chatService);

chatService.$inject = ["$q", "$timeout"];

function chatService ($q, $timeout) {

    var service = {}, listener = $q.defer(), socket = {
        client: null,
        stomp: null
    }, messageIds = [];

    service.RECONNECT_TIMEOUT = 30000;
    service.SOCKET_URL = "http://localhost:8080/chat";
    service.CHAT_TOPIC = "http://localhost:8080/topic/message";
    service.CHAT_BROKER = "http://localhost:8080/app/chat";

    service.receive = function() {
        return listener.promise;
    };

    service.send = function(message) {
        var id = Math.floor(Math.random() * 1000000);
        socket.stomp.send(service.CHAT_BROKER, {
            priority: 9
        }, JSON.stringify({
            message: message,
            id: id
        }));
        messageIds.push(id);
    };

    var reconnect = function() {
        $timeout(function() {
            initialize();
        }, this.RECONNECT_TIMEOUT);
    };

    var getMessage = function(data) {
        var message = JSON.parse(data), out = {};
        out.message = message.message;
        out.time = new Date(message.time);
        if (_.contains(messageIds, message.id)) {
            out.self = true;
            messageIds = _.remove(messageIds, message.id);
        }
        return out;
    };

    var startListener = function() {
        socket.stomp.subscribe(service.CHAT_TOPIC, function(data) {
            listener.notify(getMessage(data.body));
        });
    };

    var initialize = function() {
        socket.client = new SockJS(service.SOCKET_URL);
        socket.stomp = Stomp.over(socket.client);
        socket.stomp.connect({}, startListener);
        socket.stomp.onclose = reconnect;
    };

    initialize();
    return service;
}

 })(angular, SockJS, Stomp, _);

浏览器控制台是这样说的:
Opening Web Socket...
    Web Socket Opened...

    >>> CONNECT
    accept-version:1.1,1.0
    heart-beat:10000,10000


    version:1.1
    heart-beat:0,0
    user-name:test@test.com

    connected to server undefined
    vendor-cd0f7ffee3.js:113305
    >>> SUBSCRIBE
    id:sub-0
    destination:http://localhost:8080/topic/message

    >>> SEND
    priority:9
    destination:http://localhost:8080/app/chat
    content-length:30

    {"message":"test","id":490235}

最佳答案

我有同样的问题。以防万一它可以帮助将来的任何人。我花了几个小时在这上面。替换这个:

<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-websocket</artifactId>
    <version>5.3.8</version>
</dependency>
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-messaging</artifactId>
    <version>5.3.8</version>
</dependency>
和:
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-websocket</artifactId>
</dependency>
<dependency>
    <groupId>org.webjars</groupId>
    <artifactId>webjars-locator-core</artifactId>
</dependency>
<dependency>
    <groupId>org.webjars</groupId>
    <artifactId>sockjs-client</artifactId>
    <version>1.0.2</version>
</dependency>
<dependency>
    <groupId>org.webjars</groupId>
    <artifactId>stomp-websocket</artifactId>
    <version>2.3.3</version>
</dependency>
对我有用。

关于java - Spring WebSocket MessageMapping 不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46023389/

相关文章:

java - 搜索文本字段不返回任何值

java - 使用ant build读取java中的静态文件

python - 如何在 python 中创建长期的 websocket 连接?

java - StompBrokerRelayMessageHandler - 传输失败 : java. lang.IllegalStateException:没有可用的 TcpConnection

Spring 4 websocket + stomp + rabbitmq 和集群

java - Scriptella:如何从 clob 对象动态获取数据,然后将其插入数据库?

java - InitBinder 未被调用/调用

javascript - 浏览器的 Websocket 库?

ssl - Heroku 错误 : Websockets and ssl-endpoint features misconfiguration

java - 如何处理vert-x中的StompServerHandlers