我有一个非常简单的Spring WebSocket应用程序。但是,我正在尝试使用路径变量进行订阅以及消息映射。
我在下面发布了一个释义的示例。我希望@SendTo
批注会根据其fleetId
返回给订户。即,从POST
到/fleet/MyFleet/driver/MyDriver
应该将/fleet/MyFleet
通知订阅者,但是我没有看到这种行为。
值得注意的是,订阅文字/fleet/{fleetId}
是可行的。这是故意的吗?我是否缺少某些配置?还是这不是它的工作方式?
我对WebSockets或这个Spring项目还不太熟悉,所以在此先感谢。
Controller.java
...
@MessageMapping("/fleet/{fleetId}/driver/{driverId}")
@SendTo("/topic/fleet/{fleetId}")
public Simple simple(@DestinationVariable String fleetId, @DestinationVariable String driverId) {
return new Simple(fleetId, driverId);
}
...
WebSocketConfig.java
@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
}));
最佳答案
即使@MessageMapping
支持占位符,它们也不会在@SendTo
目标位置公开/解析。当前,无法使用@SendTo
批注定义动态目标(请参见issue 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);
}
更新:
在Spring 4.2中,支持目标变量占位符,现在可以执行以下操作:
@MessageMapping("/fleet/{fleetId}/driver/{driverId}")
@SendTo("/topic/fleet/{fleetId}")
public Simple simple(@DestinationVariable String fleetId, @DestinationVariable String driverId) {
return new Simple(fleetId, driverId);
}
关于java - Spring WebSockets @SendTo映射中的路径变量,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/27047310/