【发布时间】:2018-09-16 09:14:23
【问题描述】:
我正在尝试将目标变量应用于我的控制器中处理来自 WebSocket 的传入消息的方法。这是我想要实现的目标:
@Controller
public class DocumentWebsocketController {
@MessageMapping("/lock-document")
@SendTo("/notify-open-documents/{id}")
public Response response(@DestinationVariable("id") Long id, Message message) {
return new Response(message.getDocumentId());
}
}
问题是,目标变量仅应用于@SendTo 注释。尝试此端点时会导致以下堆栈跟踪:
12:36:43.044 [clientInboundChannel-7] ERROR org.springframework.web.socket.messaging.WebSocketAnnotationMethodMessageHandler - Unhandled exception
org.springframework.messaging.MessageHandlingException: Missing path template variable 'id' for method parameter type [class java.lang.Long]
at org.springframework.messaging.handler.annotation.support.DestinationVariableMethodArgumentResolver.handleMissingValue(DestinationVariableMethodArgumentResolver.java:70) ~[spring-messaging-4.2.4.RELEASE.jar:4.2.4.RELEASE]
at org.springframework.messaging.handler.annotation.support.AbstractNamedValueMethodArgumentResolver.resolveArgument(AbstractNamedValueMethodArgumentResolver.java:96) ~[spring-messaging-4.2.4.RELEASE.jar:4.2.4.RELEASE]
(...)
java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) [?:1.8.0_144]
at java.lang.Thread.run(Thread.java:748) [?:1.8.0_144]
我的问题是:我想实现的目标有可能吗?
【问题讨论】:
-
我不认为这是一种不同的情况,只是您试图在错误的上下文中使用
@DestinationVariable。@DestinationVariable只能用于@MessageMapping/@SubscribeMapping中的占位符,而不能用于@SendTo。错误是抱怨你想得到一个叫做“id”的东西,但你没有在你的目的地定义它。为了将具有不同占位符的动态返回目的地作为原始目的地,您必须使用 MessagingTemplate。
标签: spring spring-mvc websocket spring-websocket spring-4