使用用户目标的Spring Stomp @SubscribeMapping("/ user/...")不起作用

Ben*_*n M 13 spring stomp websocket spring-4 spring-websocket

我需要对用户目标订阅做出反应.

例:

用户订阅/user/messages,因为他想接收所有传入的消息.现在,我想查找该用户的任何消息,这些消息是在他离线时创建的,然后将它们发送给该用户.

工作代码:

客户代码:

stompClient.subscribe('/user/messages', function(msg){
    alert(msg.body);
});
Run Code Online (Sandbox Code Playgroud)

服务器代码:

template.convertAndSendToUser(p.getName(), "/messages", "message content");
Run Code Online (Sandbox Code Playgroud)

我需要的:

似乎无法在服务器端捕获用户目标订阅,即:

@SubscribeMapping("/user/messages")
public void test(Principal p) { 
    sendMessagesThatWereReceivedWhileUserWasOffline();
}
Run Code Online (Sandbox Code Playgroud)

我尝试了什么:

@SubscribeMapping("/messages")
public void test(Principal p) { ... }
Run Code Online (Sandbox Code Playgroud)

如果客户端订阅了/app/messages,这可以工作,但不会被调用 /user/messages.

我的配置:

@Configuration
@EnableWebSocketMessageBroker
public class WebSocketConfig implements WebSocketMessageBrokerConfigurer {
    @Override
    public void registerStompEndpoints(StompEndpointRegistry registry) {
        registry.addEndpoint("/stomp").withSockJS();
    }

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

    @Override
    public boolean configureMessageConverters(List<MessageConverter> messageConverters) {
        return true;
    }

    // all other methods left empty
}
Run Code Online (Sandbox Code Playgroud)

使用Spring 4.1.


我无法想象这是不可能的.我错过了什么/做错了什么?

谢谢 :)

Ser*_*mar 13

将用户前缀也定义为应用程序前缀,然后您就可以在控制器中映射订阅.组态:

@Override
public void configureMessageBroker(MessageBrokerRegistry registry) {
    registry.setApplicationDestinationPrefixes("/app", "/user");
    registry.enableSimpleBroker("/queue", "/topic");
    registry.setUserDestinationPrefix("/user");
}
Run Code Online (Sandbox Code Playgroud)

控制器:

@SubscribeMapping("/messages")
public void test(Principal p) { 
    sendMessagesThatWereReceivedWhileUserWasOffline();
}
Run Code Online (Sandbox Code Playgroud)