IT虾米网

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

third_qq_4accc0ab0fa5b582 2023年11月14日 编程语言 104 0

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


评论关闭
IT虾米网

微信公众号号:IT虾米 (左侧二维码扫一扫)欢迎添加!