Spring WebSockets XML配置不提供brokerMessagingTemplate
问题内容:
我试图将使用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中缺少一些配置来实现此目的,但是我无法在文档中找到这是什么。
有什么建议么?
问题答案:
支持服务器向客户端发送任意消息,这些消息不是对从客户端收到的消息的响应。
向客户端发送消息的一种方法是让他们首先订阅主题-
确保了解“应用程序目标前缀”和“代理前缀”之间的区别。在这种特殊情况下,您希望客户端订阅代理目标,然后您的服务器可以随时向所有这些客户端发送消息。
理解这一点的最好方法是检查参考文档中的消息流。
要发送这些消息,您的应用程序代码需要一个消息传递模板。
您可以通过将表单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>
该参考文档中提到bean的名字,但它似乎是使用XML配置时,它没有使用该名称注册。随意创建JIRA问题来改善此问题。