gpt4 book ai didi

java - Dispatcher-servlet 无法映射到 websocket 请求

转载 作者:数据小太阳 更新时间:2023-10-29 02:11:58 27 4
gpt4 key购买 nike

我正在开发一个以 Spring 为主要框架的 Java webapp(主要使用 Spring core、Spring mvc、Spring security、Spring data、Spring websocket)。

像这样在 Spring 上下文中声明消息代理会为上下文提供一个 SimpMessagingTemplate bean:

<websocket:message-broker>
<websocket:stomp-endpoint path="/stomp">
<websocket:sockjs/>
</websocket:stomp-endpoint>
<websocket:simple-broker prefix="/topic,/queue"/>
</websocket:message-broker>

我必须将此标记放在我的根上下文 (applicationContext.xml) 中,否则在该根上下文中声明的服务无法通过 websocket 向用户发送通知(因为他们需要 SimpMessagingTemplate)。

问题是,如果我将此标记放在根上下文中,客户端在订阅 websocket 时会收到 404。如果我将标记放在调度程序 servlet 中,则根上下文中的服务无法发送通知,因为它们需要 SimpMessagingTemplate(但它仅在子调度程序 servlet 上下文中可用)。

有没有办法将 dispatcher-servlet “绑定(bind)”到代理?两次声明 bean 不是正确的解决方案。

此问题与Spring : how to expose SimpMessagingTemplate bean to root context ?相同但从另一个角度看(在根上下文中声明 websocket 而不是在 dispatcher-servlet 中)

最佳答案

我找到了一个肮脏的解决方案。我不喜欢它,但鉴于缺乏关于 SO 以及现任和前任同事的答案,我不得不继续这个项目并实现了一个肮脏的修复。

肮脏的修复是 Autowire Controller 和 Scheduled 类中的 SimpMessagingTemplate(全部由 dispatcher-servlet 扫描,其中 websocket 标签 已声明),并将 SimpMessagingTemplate 作为参数传递给服务方法(在 根上下文 中声明)。

这个解决方案不是透明的(理想情况下,SimpMessagingTemplate 应该直接在服务中 Autowiring )但它确实解决了这个问题。

关于java - Dispatcher-servlet 无法映射到 websocket 请求,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36012193/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com