Spring WebSocket中关于WebSocket配置类的注意事项

情况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

image
上述问题可能就是注解使用错误,例如实现的接口是WebSocketConfigurer,结果使用的注解是@EnableWebSocketMessageBroker;或者实现的接口是WebSocketMessageBrokerConfigurer,使用的注解是@EnableWebSocket

posted @ 2024-06-19 15:12  一念错·误终生  阅读(131)  评论(0)    收藏  举报