当前位置: 首页 > 知识库问答 >
问题:

Spring WebSockets@Sendto映射中的路径变量

水铭晨
2023-03-14
...
@MessageMapping("/fleet/{fleetId}/driver/{driverId}")
@SendTo("/topic/fleet/{fleetId}")
public Simple simple(@DestinationVariable String fleetId, @DestinationVariable String driverId) {
    return new Simple(fleetId, driverId);
}
...
@Configuration
@EnableWebSocketMessageBroker
public class WebSocketConfig extends AbstractWebSocketMessageBrokerConfigurer {
    @Override
    public void configureMessageBroker(MessageBrokerRegistry config) {
        config.enableSimpleBroker("/topic");
        config.setApplicationDestinationPrefixes("/live");
    }

    @Override
    public void registerStompEndpoints(StompEndpointRegistry registry) {
        registry.addEndpoint("/fleet").withSockJS();
    }
}

index.html

var socket = new SockJS('/fleet');
var stompClient = Stomp.over(socket);
stompClient.connect({}, function(frame) {
    // Doesn't Work
    stompClient.subscribe('/topic/fleet/MyFleet', function(greeting) {
    // Works
    stompClient.subscribe('/topic/fleet/{fleetId}', function(greeting) {
        // Do some stuff
    });
});

发送样品

    stompClient.send("/live/fleet/MyFleet/driver/MyDriver", {}, JSON.stringify({
        // Some simple content
    }));

共有1个答案

谷奕
2023-03-14

尽管@messagemapping支持占位符,但它们不会在@sendto目标中公开/解析。目前,无法使用@sendto注释定义动态目的地(请参见问题SPR-12170)。您可以暂时使用SimpMessagingTemplate(这就是它在内部的工作方式)。以下是你应该怎么做:

@MessageMapping("/fleet/{fleetId}/driver/{driverId}")
public void simple(@DestinationVariable String fleetId, @DestinationVariable String driverId) {
    simpMessagingTemplate.convertAndSend("/topic/fleet/" + fleetId, new Simple(fleetId, driverId));
}

在您的代码中,目标'/topic/fleet/{fleetId}‘被视为文字,这就是订阅它的原因,只是因为您发送到了完全相同的目标。

如果您只想发送一些用户特定的初始数据,可以直接在订阅中返回:

@SubscribeMapping("/fleet/{fleetId}/driver/{driverId}")
public Simple simple(@DestinationVariable String fleetId, @DestinationVariable String driverId) {
    return new Simple(fleetId, driverId);
}
@MessageMapping("/fleet/{fleetId}/driver/{driverId}")
@SendTo("/topic/fleet/{fleetId}")
public Simple simple(@DestinationVariable String fleetId, @DestinationVariable String driverId) {
    return new Simple(fleetId, driverId);
}
 类似资料:
  • 问题内容: 我有一个非常简单的Spring WebSocket应用程序。但是,我正在尝试使用路径变量进行订阅以及消息映射。 我在下面发布了一个释义的示例。我希望注解会根据订阅者的身份返回给订阅者。即,to 应通知的订阅者,但我没有看到此行为。 值得注意的是,订阅文字作品。这是故意的吗?我是否缺少某些配置?还是这不是它的工作方式? 我对WebSockets或这个Spring项目还不太熟悉,所以在此先

  • 主要内容:Servlet 单一映射,Servlet 多重映射客户端通过 URL 地址来访问 Web 服务器中的资源,Servlet 程序若想被外界访问,就必须被映射到一个 URL 地址上。很多时候,该 URL 地址和 Servlet 程序的物理路径(在硬盘上的存储位置)并不一致,因此它被称为虚拟路径。Servlet 与虚拟路径的对应关系就叫做 Servlet 虚拟路径映射。 Servlet 虚拟路径映射可以被分为 2 类: 单一映射 多重映射 下面介绍如何

  • 谁能建议我该怎么做才能绕过这个问题?我以为Spring会把第一个破折号之前的任何东西作为ID,把后面的任何东西作为名称,但事实并非如此。 如果我使用/product/1-name执行GET,它工作得很好。如果path变量包含破折号,这似乎是一种奇怪的行为。 谢谢

  • 本文向大家介绍Spring boot 路径映射的实现,包括了Spring boot 路径映射的实现的使用技巧和注意事项,需要的朋友参考一下 这篇文章主要介绍了spring boot 路径映射的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 在spring boot中集成thymeleaf后,我们知道thymeleaf的默认的html的路径为c

  • https://skjdfsdj.execute-api.us-east-1.amazonaws.com/test/name/name2 在下一个示例中,它将是prod: https://skjdfsdj.execute-api.us-east-1.amazonaws.com/prod/name/name2 你知道这会怎么做吗? 谢谢,本尼

  • 在Spring(Boot)中,我可以使用语法将注释值外部化为应用程序/环境属性: 我还可以将控制器映射到多个路径: 我如何将两者结合起来?我想在我的属性中定义一个路径列表,或者是逗号分隔的,或者(最好)是我的中的列表: 但是我如何在注释中插入这两种列表呢? 编辑:我不知道如何从YAML中读取整个列表(可能是因为它在YAML解析时变成了单独的属性,…吧?) 对于单个CSV属性的简单情况,请说: 我可