情况1:如果只需要进行简单的通信,不需要消息代理和STOMP协议支持,那么只需要实现WebSocketConfigurer
接口
注意: 实现的接口是WebSocketConfigurer
,使用的注解是@EnableWebSocket
import org.springframework.context.annotation.Configuration;
import org.springframework.web.socket.config.annotation.EnableWebSocket;
import org.springframework.web.socket.config.annotation.WebSocketConfigurer;
import org.springframework.web.socket.config.annotation.WebSocketHandlerRegistry;
@Configuration
@EnableWebSocket
public class MyWebSocketConfig implements WebSocketConfigurer {
@Override
public void registerWebSocketHandlers(WebSocketHandlerRegistry registry) {
registry.addHandler(myWebSocketHandler(), "/my-websocket-endpoint")
.setAllowedOrigins("*")
.addInterceptors(new MyHandshakeInterceptor());
}
public WebSocketHandler myWebSocketHandler() {
return new MyWebSocketHandler();
}
}
情况2:如果需要消息代理和STOMP协议支持,那么需要实现WebSocketMessageBrokerConfigurer
接口
注意: 实现的接口是WebSocketMessageBrokerConfigurer
,使用的注解是@EnableWebSocketMessageBroker
import org.springframework.context.annotation.Configuration;
import org.springframework.messaging.simp.config.MessageBrokerRegistry;
import org.springframework.web.socket.config.annotation.EnableWebSocketMessageBroker;
import org.springframework.web.socket.config.annotation.WebSocketMessageBrokerConfigurer;
import org.springframework.web.socket.config.annotation.StompEndpointRegistry;
@Configuration
@EnableWebSocketMessageBroker
public class MyWebSocketMessageBrokerConfig implements WebSocketMessageBrokerConfigurer {
@Override
public void configureMessageBroker(MessageBrokerRegistry registry) {
registry.enableSimpleBroker("/topic", "/queue");
registry.setApplicationDestinationPrefixes("/app");
}
@Override
public void registerStompEndpoints(StompEndpointRegistry registry) {
registry.addEndpoint("/stomp-websocket-endpoint")
.setAllowedOrigins("*")
.withSockJS();
}
}
情况三: 如果你的应用需要同时支持简单的WebSocket连接和基于STOMP的消息处理,可以同时实现这两个接口
import org.springframework.context.annotation.Configuration;
import org.springframework.messaging.simp.config.MessageBrokerRegistry;
import org.springframework.web.socket.config.annotation.EnableWebSocket;
import org.springframework.web.socket.config.annotation.EnableWebSocketMessageBroker;
import org.springframework.web.socket.config.annotation.WebSocketConfigurer;
import org.springframework.web.socket.config.annotation.WebSocketHandlerRegistry;
import org.springframework.web.socket.config.annotation.WebSocketMessageBrokerConfigurer;
import org.springframework.web.socket.config.annotation.StompEndpointRegistry;
@Configuration
@EnableWebSocket
@EnableWebSocketMessageBroker
public class MyWebSocketConfig implements WebSocketConfigurer, WebSocketMessageBrokerConfigurer {
@Override
public void registerWebSocketHandlers(WebSocketHandlerRegistry registry) {
registry.addHandler(myWebSocketHandler(), "/my-websocket-endpoint")
.setAllowedOrigins("*")
.addInterceptors(new MyHandshakeInterceptor());
}
@Override
public void configureMessageBroker(MessageBrokerRegistry registry) {
registry.enableSimpleBroker("/topic", "/queue");
registry.setApplicationDestinationPrefixes("/app");
}
@Override
public void registerStompEndpoints(StompEndpointRegistry registry) {
registry.addEndpoint("/stomp-websocket-endpoint")
.setAllowedOrigins("*")
.withSockJS();
}
public WebSocketHandler myWebSocketHandler() {
return new MyWebSocketHandler();
}
}
常见错误
org.springframework.context.ApplicationContextException: Failed to start bean 'subProtocolWebSocketHandler'; nested exception is java.lang.IllegalArgumentException: No handlers
上述问题可能就是注解使用错误,例如实现的接口是WebSocketConfigurer
,结果使用的注解是@EnableWebSocketMessageBroker
;或者实现的接口是WebSocketMessageBrokerConfigurer
,使用的注解是@EnableWebSocket