最近项目上需要使用websocket做服务端,那好说啊,直接springboot集成的websocket
引入依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-websocket</artifactId>
<version>2.7.12</version>
</dependency>
配置类
@Configuration
public class WebsocketConfig {
@Bean
public ServerEndpointExporter serverEndpointExporter() {
return new ServerEndpointExporter();
}
}
wsServer
@Component
@Slf4j
@ServerEndpoint("/ws/{id}")
public class WebsocketServer {
/**
* 在线的连接
*/
private Map<String, Session> onlineSessionMap = new ConcurrentHashMap<>();
@OnOpen
public void onOpen(@PathParam("id") String id, Session session) {
log.info("WebSocket连接成功,id = {}", id);
onlineSessionMap.put(id, session);
}
@OnClose
public void onClose(@PathParam("id") String id, Session session) {
log.info("WebSocket连接关闭,id = {}", id);
onlineSessionMap.remove(id);
}
@OnMessage
public void onMessage(String message, Session session) {
log.info("WebSocket接收到客户端消息:{}", message);
}
@OnError
public void onError(Session session, Throwable error) {
log.error("WebSocket发生错误,错误信息为:{}", error.getMessage());
}
public void sendMessage(String id, String message) {
Session session = onlineSessionMap.get(id);
if (session == null) {
log.error("WebSocket发送消息失败,未找到对应的连接,id = {}", id);
return;
}
// 异步发送消息
try {
session.getAsyncRemote().sendText(message);
log.info("WebSocket发送消息成功,id = {},message = {}", id, message);
} catch (Exception e) {
log.error("WebSocket发送消息失败,错误信息为:{}", e.getMessage());
}
}
}
本来以为简简单单搞定,准备启动,结果...
Cannot deploy POJO class [com.xxx.xxx.xxx.WebsocketServer$$EnhancerBySpringCGLIB$$e1de9f9b] as it is not annotated with @ServerEndpoint
wtf??
之前没遇到过这种情况啊,没事 我有谷歌
看了下网上的情况 好像说因为这个类被代理了,追了下源码,确实是这样的
那好说啊 直接全局搜索 @Aspect
结果发现项目中的aop都是通过注解去切的 那这是怎么回事,明明我这个类也被动态代理了
此时我也快将谷歌翻烂了,仍然找不到办法解决
等一下? 会不会是其他的AOP,比如某些框架的 @Aspect 搜不到,那我换个搜法
直接全局搜索 pointcut
这时我看到这样一个配置文件
Druid数据监控的数据监控啊! TMD甘
问题找到了 可是怎么降这个包排除呢
<property name ="patterns">
直接按住command 点击patterns
进入了方法
再点击this.patterns
思路顿时明了了
直接在下面加一个 排除ws的包
启动成功