最近项目上需要使用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 {@Beanpublic ServerEndpointExporter serverEndpointExporter() {return new ServerEndpointExporter();}
}
wsServer
@Component
@Slf4j
@ServerEndpoint("/ws/{id}")
public class WebsocketServer {/*** 在线的连接*/private Map<String, Session> onlineSessionMap = new ConcurrentHashMap<>();@OnOpenpublic void onOpen(@PathParam("id") String id, Session session) {log.info("WebSocket连接成功,id = {}", id);onlineSessionMap.put(id, session);}@OnClosepublic void onClose(@PathParam("id") String id, Session session) {log.info("WebSocket连接关闭,id = {}", id);onlineSessionMap.remove(id);}@OnMessagepublic void onMessage(String message, Session session) {log.info("WebSocket接收到客户端消息:{}", message);}@OnErrorpublic 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的包
启动成功