【问题标题】:Spring WebSockets XML configuration not providing brokerMessagingTemplateSpring WebSockets XML配置不提供brokerMessagingTemplate
【发布时间】:2023-09-22 06:41:01
【问题描述】:

我正在尝试将使用 STOMP 的 WebSockets 支持添加到使用 XML 配置的 Spring MVC 应用程序中。到目前为止,一切都很顺利,我已经设法让 WebSockets 服务器监听,并且 stomp.js 可以连接到它并发送消息和接收响应。

我还没有设法开始工作的是支持服务器向客户端发送任意消息,这些消息不是对从客户端收到的消息的响应。这意味着到目前为止,这实际上只是一个更复杂的 REST 版本,并不太有用。

我的 XML 配置如下所示:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
   xmlns:websocket="http://www.springframework.org/schema/websocket"
   xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
    http://www.springframework.org/schema/websocket http://www.springframework.org/schema/websocket/spring-websocket.xsd">

  <websocket:message-broker>
    <websocket:stomp-endpoint path="/api/websocket/stomp" allowed-origins="*">
    </websocket:stomp-endpoint>

    <websocket:simple-broker prefix="/topic,/queue" />

    <websocket:message-converters>
        <bean class="org.springframework.messaging.converter.MappingJackson2MessageConverter">
            <property name="objectMapper" ref="objectMapper" />
        </bean>
    </websocket:message-converters>
   </websocket:message-broker>

  <bean class="uk.co.grahamcox.webapp.DebugController">
    <constructor-arg name="clock" ref="clock" />
    <constructor-arg name="template" ref="brokerMessagingTemplate" />
  </bean>
</beans>

(DebugController 是一个只有一个方法来返回服务器时间的类,可以作为 REST 和 WS 处理程序正常工作)

在启动时我得到:

org.springframework.beans.factory.NoSuchBeanDefinitionException: No bean named 'brokerMessagingTemplate' is defined

令人沮丧的是,IntelliJ 为我自动完成了“brokerMessagingTemplate”引用,我可以点击它进入 AbstractMessageBrokerConfiguration 中的 @Bean 定义。

我假设我在 XML 中遗漏了一些配置来完成这项工作,但我无法在文档中找到这是什么。

有什么建议吗?

【问题讨论】:

    标签: java spring spring-mvc stomp spring-websocket


    【解决方案1】:

    支持服务器向客户端发送任意消息 不是对从客户端收到的回复。

    向客户端发送消息的一种方法是让他们首先订阅一个主题——确保了解“应用程序目标前缀”和“代理前缀”之间的区别。在这种特殊情况下,您希望客户端订阅代理目标,然后您的服务器可以随时向所有这些客户端发送消息。

    了解这一点的最佳方法是查看flow of messages in the reference documentation

    要发送这些消息,您的应用程序代码需要一个消息模板。

    您可以通过将表单 bean 名称切换为实际 bean 类型 SimpMessagingTemplate 来修复您的代码示例。

      <bean class="uk.co.grahamcox.webapp.DebugController">
        <constructor-arg name="clock" ref="clock" />
        <constructor-arg name="template" class="org.springframework.messaging.simp.SimpMessagingTemplate" />
      </bean>
    

    reference documentation mentions that bean name 但在使用 XML 配置时似乎没有使用此名称注册。随意创建JIRA issue 来改进这一点。

    【讨论】:

    • 这很有效。按类型的构造函数参数并不烦人 - 类不是有效的属性 - 但在类中自动装配属性效果很好。
    • 如何确定 XML 配置做什么和不做什么?当带有 ref brokerMessagingTemplate 的 bean 是在 AbstractMessageBrokerConfiguration 中定义的该类型的特定实例时,为什么简单地命名该类型?
    • 我不明白你的问题。请为此在 * 上创建一个具体问题,或者如果您发现 javaconfig 和 xml config 之间存在不一致,请在 jira.spring.io 上创建一个问题。
    • 我的问题实际上是关于 Spring 的更一般的问题。创建:jira.spring.io/browse/SPR-15068