我正在开发一个以 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 )但它确实解决了这个问题。