【发布时间】: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