【问题标题】:Spring boot websocket 1.2.1.RELEASE - IllegalArgumentException in bean 'subProtocolWebSocketHandler' : No handlersSpring Boot websocket 1.2.1.RELEASE - bean'subProtocolWebSocketHandler'中的IllegalArgumentException:没有处理程序
【发布时间】:2015-04-12 16:05:01
【问题描述】:

所以我希望将我的项目从 spring boot 1.1.9.RELEASE 升级到 1.2.1.RELEASE。

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-websocket</artifactId>
        <version>${spring.boot.version}</version>
    </dependency>

但是,在启动时,我获得了:

Exception in thread "Thread-0" 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:770)
        at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:483)
        at org.springframework.context.annotation.AnnotationConfigApplicationContext.<init>(AnnotationConfigApplicationContext.java:95)
        at com.springagain.Application.run(Application.java:17)
Caused by: java.lang.IllegalArgumentException: No handlers
        at org.springframework.util.Assert.isTrue(Assert.java:65)
        at org.springframework.web.socket.messaging.SubProtocolWebSocketHandler.start(SubProtocolWebSocketHandler.java:234)
        at org.springframework.context.support.DefaultLifecycleProcessor.doStart(DefaultLifecycleProcessor.java:173)
        ... 8 more

这是我的 websocket 配置的样子

@Configuration
@EnableWebSocketMessageBroker
public class WebsocketConfiguration extends
        AbstractWebSocketMessageBrokerConfigurer {

    @Override
    public void configureMessageBroker(MessageBrokerRegistry registry) {
        registry.enableStompBrokerRelay("/queue/", "/topic/");
    }

    @Override
    public void registerStompEndpoints(StompEndpointRegistry registry) {
        // TODO Auto-generated method stub

    }

}

切换回仅 spring-boot-starter-websocket 依赖项的 1.1.9.RELEASE(并将所有其他 Spring Boot 依赖项保持在 1.2.1.RELEASE 和 spring core 在 4.1.4),异常消失。

看起来像一个错误,但有人可以确认吗?

更新:更多上下文 - 这是来自后端服务器代码 - 没有 websocket 客户端连接到它。目的是通过 RabbitMQ 发布“有趣的”事件,然后这些事件可供来自暴露 websocket 端点的前端服务器的客户端使用。我的前端服务器上的代码添加了支持 Socksjs 的端点:

public void registerStompEndpoints(StompEndpointRegistry registry) {
    registry.addEndpoint("/push").withSockJS();
}

从这个角度来看,要么我的理解存在根本性缺陷 :),要么 Spring 在检查是否应该始终存在 websocket 端点方面变得过分热心。

【问题讨论】:

  • @andy-wilkinson - 谢谢。我在后端将我的代码更改为@Configuration public class WebsocketConfiguration extends AbstractMessageBrokerConfiguration{ @Override public void configureMessageBroker(MessageBrokerRegistry registry) { registry.enableStompBrokerRelay("/queue/", "/topic/"); } } 并且有效(ws 消息被传递到浏览器)。但是,如果我按照您的建议尝试使用 enableSimpleBroker 而不是 enableStompBrokerRelay,则不会向浏览器传递任何消息。我也会进一步挖掘。

标签: java spring spring-boot spring-websocket


【解决方案1】:

问题的根源在于您没有在registerStompEndpoints 中配置任何端点。尝试使用 STOMP 但未配置任何 STOMP 端点的应用程序将无法正常工作。

当您使用 Spring Boot 1.1.9.RELEASE 时,您的类路径中会包含一些 Spring Framework 4.0.x jar。 Spring Framework 4.0.x 的 WebSocket 支持不会注意到错误配置并允许您的应用程序启动,即使它不起作用。 Spring Framework 4.1 的 WebSocket 支持会注意到这种错误配置并引发异常,从而提醒您注意问题。

【讨论】:

  • 嗯 - 实际上这是故意的。代码来自我的后端服务器,它不暴露给 HTTP 客户端。它的唯一作用是通过rabbitmq 代理发布“有趣”的事件。所以在我的前端项目中,我有 public void registerStompEndpoints(StompEndpointRegistry registry) { registry.addEndpoint("/push").withSockJS(); }
  • 如果您不关心接收入站 STOMP 消息,那么您的配置超出了您的需要。尝试扩展AbstractMessageBrokerConfiguration 并删除@EnableWebSocketMessageBroker。实际上,您可能也不想要继电器。顾名思义,它旨在将 STOMP 消息从 WebSocket 客户端中继到消息代理。你没有任何客户,所以没有什么可以中继的。
猜你喜欢
  • 2015-03-19
  • 1970-01-01
  • 2021-02-09
  • 2019-02-07
  • 2021-08-27
  • 1970-01-01
  • 2016-06-08
  • 2021-06-27
  • 1970-01-01
相关资源
最近更新 更多