微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

我正在开发一个以Web为主框架的Java webapp(Spring核心,Spring mvc,Spring安全,Spring数据,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.如果我将标记放在dispatcher-servlet中,那么根上下文中的服务就不能发送通知,因为它们需要SimpMessagingTemplate(但它只能在子dispatcher-servlet上下文中使用).

有没有办法将调度程序-servlet“绑定”到代理?两次声明bean不是一个正确的解决方案.

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

解决方法:

我发现了一个肮脏的解我不喜欢它,但考虑到SO以及现任和前任同事缺乏答案,我不得不继续进行项目并实施一个肮脏的修复.

脏修复是在Controller和Scheduled类中自动装配SimpMessagingTemplate(所有都由dispatcher-servlet扫描,其中声明了websocket标记),并将SimpMessagingTemplate作为参数传递给服务方法(在根上下文中声明).

这个解决方案不透明(SimpMessagingTemplate应该直接在服务中直接自动装配),但它肯定能解决问题.

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。