问题发现
最近在工作中用到了WebSocket进行前后端的消息通信,后端代码编写完后,测试一下是否连接成功,发现报No static resource websocket
.,看这个错貌似将接口变成了静态资源来访问了,第一时间觉得是端点没有注册成功,示例代码如下:
@EnableWebSocketMessageBroker
@Configurable
public class WebSocketConfig implements WebSocketMessageBrokerConfigurer {@Overridepublic void registerStompEndpoints(StompEndpointRegistry registry) {registry.addEndpoint("/websocket") // 注册端点.addInterceptors(handshakeInterceptor()) // 拦截器.setAllowedOrigins("*") // 跨域配置.withSockJS() // 启动wockjs支持.setHeartbeatTime(5000) // 设置心跳时间 5s;}@Overridepublic void configureMessageBroker(MessageBrokerRegistry registry) {//指定了消息代理的目标前缀,即服务器会将以“/screen/user”大屏用户registry.enableSimpleBroker("/app");}@Overridepublic void configureWebSocketTransport(final WebSocketTransportRegistration registry) {registry.setSendTimeLimit(15 * 1000); // 发送消息的最大时间限制registry.setMessageSizeLimit(128 * 1024); // 设置文本消息的大小限制registry.setSendBufferSizeLimit(512 * 1024); //发送缓冲区的最大大小限制}@Beanpublic HandshakeInterceptor handshakeInterceptor() {return new StaffHandshakeInterceptor();}
}
@Slf4j
public class StaffHandshakeInterceptor implements HandshakeInterceptor {@Overridepublic boolean beforeHandshake(ServerHttpRequest request, ServerHttpResponse response, WebSocketHandler wsHandler, Map<String, Object> attributes) throws Exception {log.info("WebSocket 握手连接前处理");return true;}@Overridepublic void afterHandshake(ServerHttpRequest request, ServerHttpResponse response, WebSocketHandler wsHandler, Exception exception) {log.info("WebSocket 握手连接后处理");}
}
执行结果如图:
非常头疼,看了网上很多文章和我写的都一样,就是找不到原因。
问题解决
然后在网上看到一篇文章说要加上@Component
注解才能被Spring容器管理,很疑惑什么时候@Configuration
注解还能不生效,一般定义好后就会直接注入啊,然后进入注解类看看细节,如图所示:
里面包含了@Component
注解,然后我再回去看一看我写的代码,发现注解错了,难怪不注入,如图所示:
不细心点,根本注意不到(┭┮﹏┭┮),然后把@Configurable
改为@Configuration
注解,重新启动,运行正常。