我在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 template”。Spring文档没有提供关于这个问题的更多细节。
EDIT:github工作代码示例
5条答案
按热度按时间7vhp5slm1#
我也遇到了同样的问题,错误发生是因为我的WebSocket配置文件:
没有被Spring扫描。
因此,修复方法是将具有此配置文件的包添加到扫描的包中。
guykilcj2#
奇怪的是,当您使用WebSocket命名空间时,“message-broker”元素会导致创建一个可用于注入的WebSocket MessagingTemplate bean。控制器和WebSocket命名空间是否都在同一个ApplicationContext中,或者可能一个在“根”上下文中,另一个在DispatcherServlet上下文中?
2vuwiymt3#
您应该在applicationContextxml中有一个与类名同名的bean定义id,或者在注入类时注解@Component以使Autowire工作
您可能需要在下面定义指向您的包的标记,以备以后使用
vql8enpb4#
罗森是对的。元素的添加将把SimpMessagingTemplate bean添加到注入的上下文中。这必须在web应用根上下文中,而不是Spring DispatchServlet的上下文。例如,在下面的web.xml文件中,message-broker元素应该包含在app-root.xml文件中。仅在app-mvc.xml中包含将导致NoSuchBeanDefinitionException。
huus2vyu5#
在我的例子中,我通过将Spring-Boot-Starter-Websocket的依赖项添加到pom.xml来修复错误。尽管我已经在类中导入了XML MessagingTemplate,但它仍然需要pom.xml中的依赖项: