在应用程序初始化时和运行时注册动态 websocket 会暴露不同的端点

Registration of dynamic websocket at application initialization time and at runtime has different endpoints exposed

我正在尝试注册 websocket dynamically.For 实例,我在运行时注册了“/sampleEndpoint”,因此 ServerWebSocketContainer 将注册它并开始在该端点上发布数据。但是现在,如果我在 PostConstruct 中的应用程序初始化期间执行相同的过程,我将无法连接到“/sampleEndpoint”,但必须在末尾附加“/websocket”,因此 url 变为“/sampleEndpoint/websocket”从客户端连接时。为什么我们在不同情况下得到不同的端点?

我已将 github url 添加到代码中。

https://github.com/pinkeshsagar-harptec/code-sample.git

好吧,这就是 SockJS 选项的工作原理:https://docs.spring.io/spring-framework/docs/current/reference/html/web.html#websocket-fallback

如果您的客户端不是 SockJS,那么您必须添加 /websocket 子路径。

不确定为什么它不适用于动态注册的端点...

@PostConstruct 的情况下,它不是动态的:我们仍然在应用程序上下文的配置阶段进行操作,因此它能够将我们的端点添加到静态 HandlerMapping 中。当所有 @PostConstruct 都完成了它们的逻辑时,稍后应用动态特性。您不需要手动启动该流程注册,因为自动启动阶段尚未通过 @PostConstruct 处理。

回复。 IntegrationDynamicWebSocketHandlerMapping:这听起来更像是一个错误,我需要进行更多调查。我想您仍然在那里使用 SockJS 选项,它也必须应用于动态端点。

感谢您的耐心等待!我会尽快调查并修复它。

更新

修复在这里:https://github.com/spring-projects/spring-integration/pull/3581