2014-01-31 7 views
6

Ich habe eine grundlegende Feder Websocket-Anwendung, die derzeit grundlegende Daten an die Abonnenten sendet. Derzeit verwendet das System die SimpMessageSendingOperations-Klasse als Nachrichtenhandler. Wenn ich SimpMessageSendingOperations.convertAndSend(destination, object) aufrufen, wird das Objekt konvertiert und von den abonnierten Clients empfangen.Benutzerdefinierte Stomp-Header mit Feder-Websockets

Ich möchte in der Lage sein, einen benutzerdefinierten Header an die Clients zu senden. Ich habe versucht, mit der SimpMessageSendingOperations.convertAndSend(destination, object, headers) Methode dies zu tun. Der benutzerdefinierte Header ist jedoch nicht in der Stomp-Nachricht enthalten.

Debugging durch den Code sieht es aus StompHeaderAccessor.toStompHeaderMap() Methodenaufrufe toNativeHeaderMap(), die den nativen Header und die ursprüngliche native Header-Maps verwendet, um die Stomp-Header aufzubauen.

Gibt es eine Möglichkeit, einen benutzerdefinierten Header hinzugefügt, um Nachricht zu stampfen?

Antwort

5

StompHeaderAccessor erweitert NativeMessageHeaderAccessor, wo die Nicht-Stomp-Header zu leben scheinen, außer dass sie alle in einem einzigen Header namens nativeHeaders gespeichert sind - der selbst eine Map ist.

@MessageMapping("/hello") 
@SendTo("/topic/greetings") 
public GenericMessage<Greeting> greeting(HelloMessage message) throws Exception {  
    Map<String, List<String>> nativeHeaders = new HashMap<>(); 
    nativeHeaders.put("hello", Collections.singletonList("world")); 

    Map<String,Object> headers = new HashMap<>(); 
    headers.put(NativeMessageHeaderAccessor.NATIVE_HEADERS, nativeHeaders); 

    return new GenericMessage<Greeting>(new Greeting("Hello, " + message.getName() + "!"), headers); 
} 

Ein einfacher Interceptor serverseitige Ihre benutzerdefinierten Header an den nativeHeaders Header wickeln sollten sie clientseitige genug sein, um zu belichten, wo sie als Karte message.headers.nativeHeaders zur Verfügung stehen würden. Ähnlich könnten Sie einen clientseitigen Interceptor schreiben, um die nativen Header in die regulären Header zu verschieben. Bevor also der Client die Nachricht kennt, befinden sich alle erwarteten Header einfach in der message.headers.

+0

Mit diesem konnte ich benutzerdefinierte Header hinzufügen, indem Sie einen 'MessagePostProcessor' Parameter zu der' convertAndSend' Methode hinzufügen. Die Logik innerhalb der 'postProcessMessage' überschreibt dann die nativen Header wie vorgeschlagen –

+1

Hallo Jaimie, könnten Sie eine Anfrage in JIRA erstellen, um dies zu adressieren? Obwohl Sie einen Weg gefunden haben, es zu tun, sollte es wirklich nicht so schwer sein, es herauszufinden. –

+0

@Rossen [JIRA SPR-11387] (https://jira.springsource.org/browse/SPR-11387) erstellt –