Конфигурация Spring WebSockets XML не предоставляет BrokerMessagingTemplate

Я пытаюсь добавить поддержку WebSockets с помощью STOMP в приложение Spring MVC, настроенное с использованием XML. До сих пор все шло очень хорошо, и мне удалось заставить прослушивать сервер 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», и я могу щелкнуть по ней, чтобы перейти к определению @Bean в AbstractMessageBrokerConfiguration.

Я предполагаю, что мне не хватает некоторой части конфигурации в XML, чтобы это работало, но я не могу узнать в документах, что это будет.

Какие-либо предложения?


person Graham    schedule 18.05.2016    source источник


Ответы (1)


поддержка отправки сервером произвольных сообщений клиенту, которые не являются ответами на сообщение, полученное от клиента.

Один из способов отправки сообщений клиентам — сначала подписаться на тему — убедитесь, что вы понимаете разницу между «префиксами назначения приложения» и «префиксами брокера». В этом конкретном случае вы хотите, чтобы клиенты подписывались на пункт назначения брокера, а затем ваш сервер мог отправлять сообщения всем этим клиентам в любое время.

Лучший способ понять это — просмотреть поток сообщений в справочной документации.

Чтобы отправлять эти сообщения, вашему коду приложения нужен шаблон обмена сообщениями.

Вы можете исправить свой пример кода, переключив имя компонента формы на фактический тип компонента 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>

в справочной документации упоминается это имя компонента, но кажется, что он не зарегистрирован с этим именем при использовании конфигурации XML. Не стесняйтесь создавать задачу JIRA, чтобы улучшить это.

person Brian Clozel    schedule 18.05.2016
comment
Это в основном работает. Конструктор-аргумент по типу не раздражает — класс не является допустимым атрибутом, — но автосвязывание свойства в классе работает нормально. - person Graham; 18.05.2016
comment
Как определить, что делает конфигурация XML, а что нет? И почему работает простое наименование типа, когда bean-компонент со ссылкой brokerMessagingTemplate является конкретным экземпляром этого типа, определенным в AbstractMessageBrokerConfiguration? - person jordanpg; 29.12.2016
comment
Я не понимаю вашего вопроса. Пожалуйста, создайте для этого конкретный вопрос в stackoverflow или создайте проблему на jira.spring.io, если вы видите несоответствие между конфигурацией javaconfig и xml. - person Brian Clozel; 29.12.2016
comment
Мои вопросы были действительно более общими вопросами о Spring. Создано: jira.spring.io/browse/SPR-15068 - person jordanpg; 29.12.2016