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