Spring WebSockets XML配置不提供brokerMessagingTemplate

时间:2016-05-18 08:46:26

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

我正在尝试使用STOMP向使用XML配置的Spring MVC应用程序添加WebSockets支持。到目前为止,这已经非常好了,我已经设法让一个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中缺少一些配置以使其工作,但我无法在文档中找到这将是什么。

有什么建议吗?

1 个答案:

答案 0 :(得分:2)

  

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

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

理解这一点的最佳方法是查看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来改善这一点。