gpt4 book ai didi

xml - Spring : how to expose SimpMessagingTemplate bean to root context ?

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

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

声明 message-broker在像这样的 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>

我必须把这个标签放在 dispatcher-servlet.xml 中(不是 applicationContext.xml ),否则客户端在尝试连接到 websocket 时(在初始页面加载时)将获得 404。

但是,由于此标签提供了 SimpMessagingTemplate bean(向连接的客户端发送消息)在根上下文中不可用,当服务(由根上下文扫描)发送 websocket 消息时,SimpMessagingTemplate bean 不能 Autowiring (经典 NoSuchBeanDefinitionException )。

以前,<websocket:message-broker>标签在 applicationContext.xmldispatcher-servlet.xml正在进口 applicationContext.xml并且一切正常 - 然而我惊讶地发现当我最近使用 SessionRegistry 时这是错误的修改任意用户 session 。

的确,自从DispatcherServlet正在显式导入已经隐式继承的根上下文,SessionRegistry bean 被创建了两次,导致意外行为(SO 上有几篇文章描述了这个常见错误,通常用户希望获得所有主体的列表,但由于 SessionRegistry bean 重复而得到空列表并找出这个) .

所以为了解决这个问题,我删除了

<import resource="applicationContext.xml"/>

来自 dispatcher-servlet.xml,但从那时起:

  • 要么我把<websocket:messagebroker>...</> dispatcher-servlet.xml 中的标记,在这种情况下,与 websocket 的连接成功但服务无法 Autowiring SimpMessagingTemplate
  • 或者我输入 <websocket:messagebroker>...</>applicationContext.xml 中标记,在这种情况下客户端无法连接到 websocket。
  • (或者我回到以前的版本,其中 DispatcherServlet 导入 ApplicationContext ,这打破了 SessionRegistry - 不)

这个可能相当普遍的问题的解决方案是什么? DispatcherServlet可以从根上下文访问 bean,但反之则不行,那么我应该如何解决这个问题?

最佳答案

我找到了一个肮脏的解决方案。我不喜欢它,但鉴于缺少关于 SO 的答案(另见:Dispatcher-servlet cannot map to websocket requests),以及来自现任和前任同事的答案,我不得不继续这个项目并实现了一个肮脏的修复。

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

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

关于xml - Spring : how to expose SimpMessagingTemplate bean to root context ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34774158/

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