Не удалось автоподтвердить. Не найдено beans типа SimpMessagingTemplate

Я настраиваю Websockets в Spring в основном, следуя руководству, представленному в документации.

В настоящее время я пытаюсь отправить сообщение с сервера клиенту, как описано в разделе "Отправка сообщений из любого места"

В следующем примере вы можете Autowire класс под названием SimpMessagingTemplate

@Controller
public class GreetingController {

    private SimpMessagingTemplate template;

    @Autowired
    public GreetingController(SimpMessagingTemplate template) {
        this.template = template;
    }

    @RequestMapping(value="/greetings", method=POST)
    public void greet(String greeting) {
        String text = "[" + getTimestamp() + "]:" + greeting;
        this.template.convertAndSend("/topic/greetings", text);
    }

}

Однако мой текущий проект не может найти bean "SimpMessagingTemplate". (Intellij: "Не удалось autowire. Нет beans для SimpMessagingTemplate type found.

Я проверил несколько примеров в Интернете, но я не могу найти, как получить Spring, чтобы создать экземпляр SimpMessagingTemplate. Как я могу автоустанавливать его?

EDIT:

Я решил отправить дополнительную справочную информацию. Это моя текущая конфигурация websocket:

<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-4.0.xsd">

        <!-- TODO properties to be read from a properties file -->
        <websocket:message-broker application-destination-prefix="/app">
            <websocket:stomp-endpoint path="/new_session" >
                <websocket:sockjs/>
            </websocket:stomp-endpoint>
            <websocket:simple-broker prefix="/topic"/>
        </websocket:message-broker>
</beans>

Websocket работает с этим контроллером

@Controller
public class SessionController {

    private static final Logger log = LoggerFactory.getLogger(SessionController.class);

    @MessageMapping("/new_session")
    @SendTo("/topic/session")
    public SessionStatus newSession(Session session) throws Exception {
    Thread.sleep(3000); // simulated delay
    log.info("Response sent !!");
    return new SessionStatus("StatusReport, " + session.toString() + "!");
    }
}

Я просто не уверен, как сделать эту работу

public class SessionController {

    private static final Logger log = LoggerFactory.getLogger(SessionController.class);

    private SimpMessagingTemplate template;

    @Autowired
    public SessionController(SimpMessagingTemplate template) {
    this.template = template;
    }

}

Поскольку шаблон bean "SimpMessagingTemplate" не найден. Документация Spring не содержит более подробной информации по этому вопросу.

EDIT. Пример рабочего кода в github

Ответ 1

Странно, потому что, когда вы используете пространство имен websocket, элемент "message-broker" вызывает создание SimpMessagingTemplate bean, который затем должен быть доступен для вас. Являются ли контроллеры и пространство имен websocket в одном и том же ApplicationContext или, возможно, одно в "корневом" контексте, а другое в контексте DispatcherServlet?

Ответ 2

У вас должен быть идентификатор определения bean с тем же именем, что и имя класса в вашем приложенииContext xml, или аннотировать @Component для класса инъекции для работы Autowire

<bean id="SimpMessagingTemplate " class="your-class" >

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

<context:component-scan base-package="com.x.y"/>

Ответ 3

У меня была такая же проблема, произошла ошибка, потому что мой конфигурационный файл websocket:

@Configuration
@EnableWebSocketMessageBroker
@EnableScheduling
public class WebSocketConfig extends AbstractWebSocketMessageBrokerConfigurer {

}

не был отсканирован spring.

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

Ответ 4

Россен был прав. Добавление элемента добавит SimpMessagingTemplate bean в контекст для инъекции. Это должно быть в корневом контексте веб-приложения, а не в контексте для Spring DispatchServlet. Например, в следующем файле web.xml элемент message-broker должен быть включен в файл app-root.xml. Включение только в app-mvc.xml вызовет исключение NoSuchBeanDefinitionException.
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:/spring/app-root.xml</param-value>
</context-param>

<servlet>
<servlet-name>Spring MVC Dispatcher Servlet</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>classpath:/spring/app-mvc.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>