websocket - 尝试实现 websockets 时出现 Failed to start bean 'subProtocolWebSocketHandler' 异常

标签 websocket tomcat8 spring-websocket spring-4

我正在浏览 Spring 4 的 websockets 教程 here 。我让它在客户端调用时服务器响应的地方工作。

但是,我的用例是让服务器推送消息,而无需客户端调用。所以我在网上查找了如何做到这一点,并发现了 few posts that说我需要使用名为 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

我找到了this postthis post遇到同样的问题,但他们都没有发布真正的解决方案。

我的 websocket Controller :

@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] + "!"));
        }        
    }
}

我的 websocket 配置:

@Configuration
@EnableWebSocketMessageBroker
public class WebSocketConfig  implements WebSocketMessageBrokerConfigurer  {

    @Override
    public void configureMessageBroker(MessageBrokerRegistry config) {
        config.enableSimpleBroker("/topic");
        config.setApplicationDestinationPrefixes("/app");
    }

    @Override
    public void registerStompEndpoints(StompEndpointRegistry registry) {
        registry.addEndpoint("/hello").withSockJS();
    }

    @Override
    public void addArgumentResolvers(List<HandlerMethodArgumentResolver> arg0) {
        // TODO Auto-generated method stub

    }

    @Override
    public void addReturnValueHandlers(List<HandlerMethodReturnValueHandler> arg0) {
        // TODO Auto-generated method stub

    }

    @Override
    public void configureClientInboundChannel(ChannelRegistration arg0) {
        // TODO Auto-generated method stub

    }

    @Override
    public void configureClientOutboundChannel(ChannelRegistration arg0) {
        // TODO Auto-generated method stub

    }

    @Override
    public boolean configureMessageConverters(List<MessageConverter> arg0) {
        // TODO Auto-generated method stub
        return true;
    }

    @Override
    public void configureWebSocketTransport(WebSocketTransportRegistration arg0) {
        // TODO Auto-generated method stub

    }
}

此外,我还必须将 org.springframework.web.socket.config 添加到组件扫描中,因为如果没有这个,我会遇到 Autowiring 异常( ref )。

我正在使用 Spring 4.2.5 和 Tomcat 8。

感谢任何帮助。 如果您需要更多信息,请告诉我。 谢谢。

最佳答案

在解决这个问题几个小时后,我通过将 websocket 配置添加到根配置中解决了这个问题。

@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[] { "/" };
    }
}

关于websocket - 尝试实现 websockets 时出现 Failed to start bean 'subProtocolWebSocketHandler' 异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37638396/

相关文章:

java - 我应该在环境变量 PATH 中同时添加 JAVA_HOME 和 JRE_HOME 吗?

amazon-web-services - 为什么 grails websockets 连接失败,但在使用 AWS ELB 时继续接收浏览器中已订阅的消息?

spring - 如何使用 Spring-websocket 拒绝基于用户权限的主题订阅

javascript - 客户端可以访问分配的套接字吗?

docker - docker组成nginx和tomcat,仅在互联网上公开nginx

java - 信任 java Websocket 客户端中的所有证书

spring - 分别从 web.xml 和 web-fragment.xml 定义上下文参数

java - Spring Stomp over Websocket : Message/Buffer/Cache/Stream limits

amazon-web-services - 如何让express js和socket io监听不同的端口

c++ - MS Http 服务器 API(< Win 8)和 WebSockets