采用STOMP时会报Can't Autowired SimpMessagingTemplate 或者Can't Autowired AbstractMessageSendingTe

当我们使用spring websocket进行订阅推送时无疑要选择STOMP的方式,当我在项目中使用的时候采用的是将kafka中的消息通过STOMP推送到客户端,但是再用SimpMessagingTemplate 发送消息的时候报错Can't Autowired SimpMessagingTemplate...

Caused by: org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type 'org.springframework.messaging.simp.SimpMessagingTemplate' available: expected at least 1 bean which qualifies as autowire candidate. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)}	at org.springframework.beans.factory.support.DefaultListableBeanFactory.raiseNoMatchingBeanFound(DefaultListableBeanFactory.java:1644)	at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:1203)	at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:1164)	at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:593)	... 62 more

经过探索,导致该问题出现的原因是:将STOMP的配置放在了Spring的DispatcherServlet上下文中。正确的是应该讲该配置放到ContextLoaderListener 上下文中。

也就是说你的配置文件或者采用注解方式来实现websocket stomp的相关配置时一定要将配置放在spring-beans下面或者将你的websocket配置类的扫描路径

<context:component-scan base-package="你的路径"/>

放在spring-beans中 ,切勿放在spring-servlet.xml中。

最后讲讲ContextLoaderListener与DispatcherServlet所创建的上下文ApplicationContext的区别

1.ContextLoaderListener中创建ApplicationContext主要用于整个Web应用程序需要共享的一些组件,比如DAO,数据库的ConnectionFactory等。而由DispatcherServlet创建的ApplicationContext主要用于和该Servlet相关的一些组件,比如Controller、ViewResovler等。
2.对于作用范围而言,在DispatcherServlet中可以引用由ContextLoaderListener所创建的ApplicationContext,而反过来不行。

附上参考链接:

https://blog.csdn.net/hefrankeleyn/article/details/89742745

https://blog.csdn.net/winfredzen/article/details/78202828

第一个链接是告诉你为何出错,第二个链接具体分析ContextLoaderListener与DispatcherServlet的区别和如何配置!

 

 

上一篇:Spring中自动装配Bytype Byname区别


下一篇:jdbc.DataSourceProperties$DataSourceBeanCreationException: Failed to determine a suitable driver cla