2017-08-10 10 views
0

Dans mon application Spring Boot 1.5 avec Spring Websocket, je souhaite définir un en-tête STOMP personnalisé sur la valeur de retour d'une méthode @MessageMapping, mais je ne sais pas comment procéder. Par exemple:En-tête STOMP sur @MessageMapping return

@Controller 
public class ChannelController { 

    @MessageMapping("/books/{id}") 
    public Book receive(@DestinationVariable("id") Long bookId) { 
     return findBook(bookId); 
    } 

    private Book findBook(Long bookId) { 
     return //... 
    } 
} 

Lorsque receive est déclenché à partir STOMP SEND d'un client, je voudrais le cadre de réponse STOMP MESSAGE avec le corps de livre pour un en-tête personnalisé: message-type:BOOK comme ceci:

MESSAGE 
message-type:BOOK 
destination:/topic/books/1 
content-type:application/json;charset=UTF-8 
subscription:sub-0 
message-id:0-7 
content-length:1868 

{ 
    "createdDate" : "2017-08-10T10:40:39.256", 
    "lastModifiedDate" : "2017-08-10T10:42:57.976", 
    "id" : 1, 
    "name" : "The big book", 
    "description" : null 
} 
^@ 

Comment faire J'ai défini un en-tête STOMP pour la valeur de réponse de réponse dans un @MessageMapping?

Répondre

0

Si la signature de la valeur de retour est importante, vous pouvez utiliser SimpMessagingTemplate comme @Shchipunov noté dans les commentaires à sa réponse:

@Controller 
@AllArgsConstructor 
public class ChannelController { 

    private final SimpMessagingTemplate messagingTemplate; 

    @MessageMapping("/books/{id}") 
    public void receive(@DestinationVariable("id") Long bookId, SimpMessageHeaderAccessor accessor) { 
     accessor.setHeader("message-type", "SESSION"); 

     messagingTemplate.convertAndSend(
      "/topic/books/" + bookId, findBook(bookId), accessor.toMap() 
     ); 
    } 

    private Book findBook(Long bookId) { 
     return //... 
    } 
} 

qui ne correctement sérialiser au cadre MESSAGE dans la question.

+0

Cela ne répond pas à la question, mais je vais accepter cette réponse jusqu'à une réponse qui résout la question de la valeur de retour est fournie. –

0

Vous pouvez essayer cette solution:

@MessageMapping("/books/{id}") 
public GenericMessage<Book> receive(@DestinationVariable("id") Long bookId) { 
    Map<String, List<String>> nativeHeaders = new HashMap<>(); 
    nativeHeaders.put("message-type", Collections.singletonList("BOOK")); 

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

    return new GenericMessage<Book>(findBook(bookId), headers); 
} 
+0

Chose curieuse, ce sérialise à tort: ​​ '<<< MESSAGE destination:/sujet/Livres/1 type de contenu: application/JSON; charset = UTF-8 abonnement: sous-1 message id: 0-8 -longueur du contenu: 489 { "charge utile": { "CreatedDate": "2017-08-10T10: 40: 39,256" "LastModifiedDate": « 2017-08-10T10: 42: 57,976 ", " id ": 471, " nom ":" Le grand livre ", " description ": null }, " en-têtes ": { "nativeHeaders": { "message type": [ "LIVRE"] }, "id": "7596b750-433e-c0b6-95b2-afd9bb9cbfbf", "timestamp": 1502383378174 }} ' place de (voir commentaire suivant): –

+0

'<<< MESSAGE message Type: livre destination:/sujet/Livres/1 type de contenu: application/JSON; charset = UTF-8 abonnement: 1 sous- un message -id: 0-8 -longueur du contenu: 489 { "CreatedDate": "2017-08-10T10: 40: 39,256" "LastModifiedDate": "2017-08-10T10: 42: 57,976", "je d ": 471, " nom ":" Le grand livre ", " description ": null }' –

+0

À partir de la console Chrome, il est évident qu'il est incorrect de sérialiser 'payload' et' headers' à la charge utile du message au lieu d'ajouter le en-têtes vers les en-têtes de message STOMP et l'envoi de la charge utile dans le corps du message STOMP. –