Spring 4 websockets动态MessageMapping未执行

时间:2014-03-06 08:54:35

标签: spring sockjs spring-websocket

我在Tomcat 8上使用Spring 4 websockets,我有以下配置:

<websocket:message-broker application-destination-prefix="/app">
    <websocket:stomp-endpoint path="/notify">
        <websocket:sockjs />
    </websocket:stomp-endpoint>
    <websocket:simple-broker prefix="/topic" />
</websocket:message-broker>

我的Spring控制器有以下方法:

@MessageMapping("/notify/{client}")
public void pushMessage(@DestinationVariable long client, String message) {
    System.out.println("Send " + message + " to " + client);
    template.convertAndSend("/topic/push/" + client, message);
}

所以我在这里要做的是,如果客户端1想要向客户端2发送消息,他使用/app/notify/2。然后Spring控制器将消息推送到主题/topic/push/2

我在客户端编写了以下代码:

var id = 1;
var sock = new SockJS('/project/notify');
var client = Stomp.over(sock);
client.connect({}, function() {
    client.subscribe('/topic/push/' + id, function(message) {
        console.log(message);
    });
});

连接完美,/project只是我的应用程序的上下文根。

我的客户端也有以下代码发送消息:

client.send('/app/notify/' + id, {}, "test");

两个变量(clientid)都是可访问的,我没有从代码的这一部分得到任何错误,我可以在我的控制台中看到消息实际发送过了:

>>> SEND
destination:/app/notify/1
content-length:4

test 

但是,我的控制器中的System.out.println()语句永远不会被执行,所以我认为我的控制器映射有问题或我没有正确使用目标端点(我不明白为什么我必须在此处指定应用程序前缀,但在连接到该端点时则不指定。)

1 个答案:

答案 0 :(得分:3)

当使用简单的String消息作为有效负载时,似乎无法映射。当我将message包裹在一个对象中时,它就可以正常工作。

编辑:正如评论中所述,Spring已经附带了一个名为TextMessage类的消息包装器。