首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >@MessageMapping返回的STOMP头

@MessageMapping返回的STOMP头
EN

Stack Overflow用户
提问于 2017-08-10 12:18:05
回答 2查看 3.3K关注 0票数 1

在我使用Spring的Spring 1.5应用程序中,我想在@MessageMapping方法的返回值上设置一个自定义的STOMP,但是我不知道如何做到这一点。例如:

代码语言:javascript
运行
复制
@Controller
public class ChannelController {

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

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

当从客户端的receive触发STOMP SEND时,我希望带有图书主体的STOMP MESSAGE回复框架具有一个自定义标题:message-type:BOOK

代码语言:javascript
运行
复制
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 
}
^@

如何为@MessageMapping中的答复返回值设置STOMP头

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-08-10 18:25:42

如果返回值签名不重要,您可以使用SimpMessagingTemplate作为@Shchipunov在对他的答复的评论中指出:

代码语言:javascript
运行
复制
@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", "BOOK");

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

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

它正确地序列化到问题中的消息帧。

票数 5
EN

Stack Overflow用户

发布于 2017-08-10 12:45:04

您可以尝试此解决方案:

代码语言:javascript
运行
复制
@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
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45613533

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档