Angularjs SocksJS/Stomp/Spring websocket缺少会话服务器异常:否“;用户”;消息中的标题

Angularjs SocksJS/Stomp/Spring websocket缺少会话服务器异常:否“;用户”;消息中的标题,angularjs,spring,websocket,stomp,spring-websocket,Angularjs,Spring,Websocket,Stomp,Spring Websocket,我需要对用户目标订阅作出反应 例如: 用户订阅/user/api/通知,因为他们希望接收所有传入的通知。现在,我想查找此用户在脱机时创建的所有通知,然后将它们发送给该用户 通过AngularJS的客户端: 'use strict'; angular.module('app.services').service('socketService', ['$rootScope', '$stomp', 'storageService', 'storageConstant', 'propertiesCon

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

例如:

用户订阅/user/api/通知,因为他们希望接收所有传入的通知。现在,我想查找此用户在脱机时创建的所有通知,然后将它们发送给该用户

通过AngularJS的客户端:

'use strict';

angular.module('app.services').service('socketService', ['$rootScope', '$stomp', 'storageService', 'storageConstant', 'propertiesConstant',
function socketService($rootScope, $stomp, storageService, storageConstant, propertiesConstant) {
    var connection;
    var subscriptions = {};

    this.subscribe = function subscribe() {
        var authToken = storageService.getSessionItem(storageConstant.AUTH_TOKEN);
        var headers = (authToken) ? {"X-AUTH-TOKEN": authToken} : {};

        connect(headers);

        connection.then(function (frame) {
            if (!(subscriptions.notifications)) {
                subscriptions.notifications = $stomp.subscribe('/user/api/notifications', function (payload, headers, res) {
                    $rootScope.$apply(function () {
                        $rootScope.notificationCount = payload.length;
                    })
                }, headers);
            }
        });
    };

    this.unsubscribe = function unsubscribe() {
        if (subscriptions.notifications) {
            subscriptions.notifications.unsubscribe();
        }

        if (connection) {
            $stomp.disconnect(function () {
                delete $rootScope.notificationCount;
            });

            connection = null;
        }

        subscriptions = {};
    };

    function connect(headers) {
        if (!(connection)) {
            connection = $stomp.connect(propertiesConstant.WEBSOCKET_API_URL + '/stomp', headers);
        }
    }
}]);
API通过Spring 4:

控制器终结点:

@SubscribeMapping("/api/notifications")
    public List<NotificationDetail> notifications(Principal p) {
        String user = p.getName();

        LOG.info("User is {}", user);

        return notificationService.getNotifications(AuthenticationUtil.getUsername());
    }
我在API上收到的例外情况:

2016-05-26 13:06:59,766 ERROR  - Unhandled exception
org.springframework.messaging.simp.annotation.support.MissingSessionUserException: No "user" header in message
    at org.springframework.messaging.simp.annotation.support.PrincipalMethodArgumentResolver.resolveArgument(PrincipalMethodArgumentResolver.java:42)
    at org.springframework.messaging.handler.invocation.HandlerMethodArgumentResolverComposite.resolveArgument(HandlerMethodArgumentResolverComposite.java:98)
    at org.springframework.messaging.handler.invocation.InvocableHandlerMethod.getMethodArgumentValues(InvocableHandlerMethod.java:138)
    at org.springframework.messaging.handler.invocation.InvocableHandlerMethod.invoke(InvocableHandlerMethod.java:107)
    at org.springframework.messaging.handler.invocation.AbstractMethodMessageHandler.handleMatch(AbstractMethodMessageHandler.java:490)
    at org.springframework.messaging.simp.annotation.support.SimpAnnotationMethodMessageHandler.handleMatch(SimpAnnotationMethodMessageHandler.java:497)
    at org.springframework.messaging.simp.annotation.support.SimpAnnotationMethodMessageHandler.handleMatch(SimpAnnotationMethodMessageHandler.java:87)
    at org.springframework.messaging.handler.invocation.AbstractMethodMessageHandler.handleMessageInternal(AbstractMethodMessageHandler.java:451)
    at org.springframework.messaging.handler.invocation.AbstractMethodMessageHandler.handleMessage(AbstractMethodMessageHandler.java:389)
    at org.springframework.messaging.support.ExecutorSubscribableChannel$SendTask.run(ExecutorSubscribableChannel.java:135)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
    at java.lang.Thread.run(Thread.java:745)
我错过了什么/做错了什么


谢谢:)

据我所知,当您使用
setUserDestination
时,您正在指定用户前缀;这意味着代理尝试搜索用户专用的主题/队列;尽量避免使用
setUserDestination
,但要使用
enableSimpleBroker
2016-05-26 13:06:59,766 ERROR  - Unhandled exception
org.springframework.messaging.simp.annotation.support.MissingSessionUserException: No "user" header in message
    at org.springframework.messaging.simp.annotation.support.PrincipalMethodArgumentResolver.resolveArgument(PrincipalMethodArgumentResolver.java:42)
    at org.springframework.messaging.handler.invocation.HandlerMethodArgumentResolverComposite.resolveArgument(HandlerMethodArgumentResolverComposite.java:98)
    at org.springframework.messaging.handler.invocation.InvocableHandlerMethod.getMethodArgumentValues(InvocableHandlerMethod.java:138)
    at org.springframework.messaging.handler.invocation.InvocableHandlerMethod.invoke(InvocableHandlerMethod.java:107)
    at org.springframework.messaging.handler.invocation.AbstractMethodMessageHandler.handleMatch(AbstractMethodMessageHandler.java:490)
    at org.springframework.messaging.simp.annotation.support.SimpAnnotationMethodMessageHandler.handleMatch(SimpAnnotationMethodMessageHandler.java:497)
    at org.springframework.messaging.simp.annotation.support.SimpAnnotationMethodMessageHandler.handleMatch(SimpAnnotationMethodMessageHandler.java:87)
    at org.springframework.messaging.handler.invocation.AbstractMethodMessageHandler.handleMessageInternal(AbstractMethodMessageHandler.java:451)
    at org.springframework.messaging.handler.invocation.AbstractMethodMessageHandler.handleMessage(AbstractMethodMessageHandler.java:389)
    at org.springframework.messaging.support.ExecutorSubscribableChannel$SendTask.run(ExecutorSubscribableChannel.java:135)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
    at java.lang.Thread.run(Thread.java:745)