无法自动装配。找不到SimpMessagingTemplate类型的bean

时间:2014-04-08 01:21:27

标签: java javabeans autowired stomp spring-messaging

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

我正在尝试从服务器向客户端发送消息,如“Sending messages from anywhere”部分所述

按照示例,您可以自动装配一个名为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 个答案:

答案 0 :(得分:9)

我遇到了同样的问题,因为我的websocket配置文件发生了错误:

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

}

没有被春天扫描。

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

答案 1 :(得分:6)

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

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

您可能需要定义以下标记,指向您的包以供以后使用

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

答案 2 :(得分:5)

奇怪,因为当你使用websocket命名空间时,&#34; message-broker&#34; element会导致创建一个SimpMessagingTemplate bean,然后该bean可供您注入。控制器和websocket命名空间都在同一个ApplicationContext中,或者可能是&#34; root&#34;上下文和DispatcherServlet上下文中的另一个?

答案 3 :(得分: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>