18

我基本上按照文档中提供的指南在 Spring 中配置 Websockets。

我目前正在尝试按照“从任何地方发送消息” 部分中的说明从服务器向客户端发送消息

按照示例,您可以自动装配一个名为 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:'无法自动装配。找不到 SimpMessagingTemplate 类型的 bean'。

我在互联网上检查了几个示例,但我找不到如何让 Spring 创建 SimpMessagingTemplate 的实例。我怎样才能自动接线?

编辑:

我决定发送更多的背景信息。这是我当前的 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 文档没有提供有关此问题的更多详细信息。

编辑: github中的工作代码示例

4

4 回答 4

16

我有同样的问题,发生错误是因为我的 websocket 配置文件:

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

}

没有被春天扫描。

所以解决方法是将带有此配置文件的包添加到扫描的包中。

于 2014-08-05T11:44:27.030 回答
6

您应该在 applicationContext xml 中有一个与类名同名的 bean 定义 ID,或者在注入类时注释 @Component 以使 Autowire 工作

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

您可能需要在下面定义指向您的包的标签以供以后使用

<context:component-scan base-package="com.x.y"/>
于 2014-04-08T06:23:24.770 回答
6

奇怪,因为当您使用 websocket 命名空间时,“message-broker”元素会导致创建一个 SimpMessagingTemplate bean,然后您应该可以将其注入。控制器和 websocket 命名空间是否都在同一个 ApplicationContext 中,或者一个在“根”上下文中,另一个在 DispatcherServlet 上下文中?

于 2014-04-14T13:45:19.357 回答
1

罗森是对的。添加元素会将 SimpMessagingTemplate bean 添加到上下文以进行注入。这必须在 Web 应用程序根上下文中,而不是 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>
于 2014-04-19T05:49:08.493 回答