SocksJS / Stomp / Spring websocket MissingSessionUserException: в сообщении отсутствует "пользовательский" заголовок
Мне нужно отреагировать на назначение подписки пользователя.
Пример:
Пользователь подписывается на /user/api/notifications, потому что он хочет получать все входящие уведомления. Теперь я хотел бы просмотреть любые уведомления для этого пользователя, которые были созданы, когда он был в автономном режиме, а затем отправить их этому пользователю.
Клиент через 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());
}
Конфигурация:
@Configuration
@EnableWebSocketMessageBroker
public class WebSocketConfig extends AbstractWebSocketMessageBrokerConfigurer {
@Override
public void configureMessageBroker(MessageBrokerRegistry registry) {
super.configureMessageBroker(registry);
registry.setApplicationDestinationPrefixes("/app", "/user");
registry.setUserDestinationPrefix("/user");
}
@Override
public void registerStompEndpoints(StompEndpointRegistry registry) {
registry.addEndpoint("/stomp").withSockJS();
}
}
Исключение я получаю по 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)
Что я пропустил / сделал неправильно?
Спасибо:)