获取启动bean失败';子目录WebSockEthandler';尝试实现WebSocket时发生异常
我将学习Spring4教程中的WebSocket。我让它在服务器响应客户端调用时工作 然而,我的用例是让服务器推送消息,而不需要客户端调用。所以我在网上查了一下如何做到这一点,发现有人说我需要使用一种叫做获取启动bean失败';子目录WebSockEthandler';尝试实现WebSocket时发生异常,websocket,tomcat8,spring-websocket,spring-4,Websocket,Tomcat8,Spring Websocket,Spring 4,我将学习Spring4教程中的WebSocket。我让它在服务器响应客户端调用时工作 然而,我的用例是让服务器推送消息,而不需要客户端调用。所以我在网上查了一下如何做到这一点,发现有人说我需要使用一种叫做SimpMessagingTemplate的东西。 因此,我将代码更改为使用SimpMessagingTemplate 现在,我在服务器控制台中得到了此异常: 04-Jun-2016 22:49:24.093 SEVERE [ContainerBackgroundProcessor[Standa
SimpMessagingTemplate
的东西。
因此,我将代码更改为使用SimpMessagingTemplate
现在,我在服务器控制台中得到了此异常:
04-Jun-2016 22:49:24.093 SEVERE [ContainerBackgroundProcessor[StandardEngine[Catalina]]] org.springframework.web.context.ContextLoader.initWebApplicationContext Context initialization failed
org.springframework.context.ApplicationContextException: Failed to start bean 'subProtocolWebSocketHandler'; nested exception is java.lang.IllegalArgumentException: No handlers
at org.springframework.context.support.DefaultLifecycleProcessor.doStart(DefaultLifecycleProcessor.java:176)
at org.springframework.context.support.DefaultLifecycleProcessor.access$200(DefaultLifecycleProcessor.java:51)
at org.springframework.context.support.DefaultLifecycleProcessor$LifecycleGroup.start(DefaultLifecycleProcessor.java:346)
at org.springframework.context.support.DefaultLifecycleProcessor.startBeans(DefaultLifecycleProcessor.java:149)
at org.springframework.context.support.DefaultLifecycleProcessor.onRefresh(DefaultLifecycleProcessor.java:112)
at org.springframework.context.support.AbstractApplicationContext.finishRefresh(AbstractApplicationContext.java:852)
at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:541)
at org.springframework.web.context.ContextLoader.configureAndRefreshWebApplicationContext(ContextLoader.java:444)
at org.springframework.web.context.ContextLoader.initWebApplicationContext(ContextLoader.java:326)
at org.springframework.web.context.ContextLoaderListener.contextInitialized(ContextLoaderListener.java:107)
at org.apache.catalina.core.StandardContext.listenerStart(StandardContext.java:4809)
at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5251)
at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:147)
at org.apache.catalina.core.StandardContext.reload(StandardContext.java:3827)
at org.apache.catalina.loader.WebappLoader.backgroundProcess(WebappLoader.java:291)
at org.apache.catalina.core.StandardContext.backgroundProcess(StandardContext.java:5608)
at org.apache.catalina.core.ContainerBase$ContainerBackgroundProcessor.processChildren(ContainerBase.java:1377)
at org.apache.catalina.core.ContainerBase$ContainerBackgroundProcessor.processChildren(ContainerBase.java:1381)
at org.apache.catalina.core.ContainerBase$ContainerBackgroundProcessor.processChildren(ContainerBase.java:1381)
at org.apache.catalina.core.ContainerBase$ContainerBackgroundProcessor.run(ContainerBase.java:1349)
at java.lang.Thread.run(Thread.java:745)
Caused by: java.lang.IllegalArgumentException: No handlers
at org.springframework.util.Assert.isTrue(Assert.java:68)
at org.springframework.web.socket.messaging.SubProtocolWebSocketHandler.start(SubProtocolWebSocketHandler.java:251)
at org.springframework.context.support.DefaultLifecycleProcessor.doStart(DefaultLifecycleProcessor.java:173)
... 20 more
我发现并解决了相同的问题,但没有一个真正的解决方案张贴
我的websocket控制器:
@Controller
public class WebSockController {
private SimpMessagingTemplate template;
@Autowired
public WebSockController(SimpMessagingTemplate template) {
this.template = template;
}
@MessageMapping("/hello")
public void greeting(GreetingsFromClient message) throws Exception {
String[] messages = {"message1","message2","message3","message4","message5"};
for(int i=0 ; i<messages.length ; i++){
Thread.sleep(3000); // simulated delay
this.template.convertAndSend("/topic/greetings", new GreetingsFromServer("Hello, " + messages[i] + "!"));
}
}
}
@控制器
公共类WebSockController{
私有SimpMessagingTemplate;
@自动连线
公共WebSockController(SimpMessageTemplate模板){
this.template=模板;
}
@MessageMapping(“/hello”)
公共无效问候语(来自客户端消息的问候语)引发异常{
字符串[]messages={“message1”、“message2”、“message3”、“message4”、“message5”};
对于(inti=0;i在与这个问题斗争了几个小时之后,我通过将websocket配置添加到rootconfig中解决了这个问题
@Configuration
@ComponentScan({ "xxxxxx.xxxxxxxxx.controllers" })
@Import({SecurityConfig.class, WebSocketConfig.class, HibernateConfig.class})
public class RootConfig {
}
使用根配置的我的应用程序初始值设定项
public class WebApplicationInitializer extends AbstractAnnotationConfigDispatcherServletInitializer {
@Override
protected Class<?>[] getRootConfigClasses() {
return new Class[] { RootConfig.class };
}
@Override
protected Class<?>[] getServletConfigClasses() {
return new Class[] { AppConfig.class };
}
@Override
protected String[] getServletMappings() {
return new String[] { "/" };
}
}
公共类WebApplicationInitializer扩展了AbstractAnnotationConfigDispatchersServletInitializer{
@凌驾
受保护类[]getRootConfigClasses(){
返回新类[]{RootConfig.Class};
}
@凌驾
受保护类[]getServletConfigClasses(){
返回新类[]{AppConfig.Class};
}
@凌驾
受保护的字符串[]getServletMappings(){
返回新字符串[]{”/“};
}
}
public class WebApplicationInitializer extends AbstractAnnotationConfigDispatcherServletInitializer {
@Override
protected Class<?>[] getRootConfigClasses() {
return new Class[] { RootConfig.class };
}
@Override
protected Class<?>[] getServletConfigClasses() {
return new Class[] { AppConfig.class };
}
@Override
protected String[] getServletMappings() {
return new String[] { "/" };
}
}