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

我目前正在尝试按照“Sending messages from anywhere”部分中的说明从服务器向客户端发送消息。

在该示例之后,您可以 Autowiring 一个名为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:“无法 Autowiring 线。找不到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 一起工作
@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中的工作代码示例

最佳答案

奇怪,因为当您使用websocket命名空间时,“message-broker”元素导致创建SimpMessagingTemplate bean,然后可以将其注入(inject)。 Controller 和websocket命名空间都在同一个ApplicationContext中,还是一个在“根”上下文中,另一个在DispatcherServlet上下文中?

关于java - 无法自动接线。找不到SimpMessagingTemplate类型的bean,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/22925951/

10-11 17:30