无法自动接线。未找到 SimpMessagingTemplate 类型的豆子

我基本上是按照文档中提供的指南在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 类型的豆子'。

我已经在互联网上检查了几个例子,但我找不到如何让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中工作代码的示例


答案 1

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

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

}

春天没有扫描。

因此,修复方法是将此配置文件的软件包添加到扫描的软件包中。


答案 2

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


推荐