当前位置: 首页 > news >正文

it is not annotated with @ClientEndpoint“

这个错误的原因是:尝试将一个@ClientEndpoint注解的类用作WebSocket客户端,但WebSocket规范要求客户端类必须用@ClientEndpoint标记。

具体来说,错误信息中的DocChatWebSocketController$1是一个内部类($1表示匿名内部类),它没有被@ClientEndpoint注解修饰,因此无法被识别为合法的WebSocket客户端。

解决方案:定义标准的WebSocket客户端类

需要创建一个单独的类,用@ClientEndpoint注解标记,并实现WebSocket回调方法:

使用客户端类建立连接

在你的控制器或服务中,通过WebSocketContainer创建连接:

import javax.websocket.ContainerProvider;
import javax.websocket.WebSocketContainer;
import java.net.URI;public class DocChatService {private ChatdocWebSocketClient client;// 建立连接的方法public void connect() throws Exception {WebSocketContainer container = ContainerProvider.getWebSocketContainer();// 替换为实际的Chatdoc WebSocket地址URI uri = new URI("ws://chatdoc-server-domain/ws-endpoint");// 创建客户端实例并连接client = new ChatdocWebSocketClient();container.connectToServer(client, uri);}// 发送消息的方法public void send(String message) throws IOException {if (client != null) {client.sendMessage(message);}}
}

关键注意点

  1. 必须添加@ClientEndpoint注解:这是WebSocket客户端的标识,缺少则会报你遇到的错误。
  2. 避免使用匿名内部类:错误中的$1表明你可能用了匿名类作为客户端,必须定义独立的类。
  3. 客户端与服务端注解区分
    • 服务端用@ServerEndpoint
    • 客户端用@ClientEndpoint(不要混淆)

按上述方式定义客户端后,即可正常建立WebSocket连接。

代码示例:

package com.yourcompany.knowledge.util;import javax.websocket.*;
import java.io.IOException;@ClientEndpoint
public class ChatdocClientEndpoint {private Session userSession;private MessageHandler.Whole<String> messageHandler;private Runnable onError;public ChatdocClientEndpoint(MessageHandler.Whole<String> messageHandler, Runnable onError) {this.messageHandler = messageHandler;this.onError = onError;}@OnOpenpublic void onOpen(Session session) {this.userSession = session;}@OnMessagepublic void onMessage(String message) {if (messageHandler != null) messageHandler.onMessage(message);}@OnErrorpublic void onError(Session session, Throwable thr) {if (onError != null) onError.run();}@OnClosepublic void onClose(Session session, CloseReason closeReason) {// 可选:处理关闭}public void sendText(String text) throws IOException {if (userSession != null && userSession.isOpen()) {userSession.getBasicRemote().sendText(text);}}public void close() throws IOException {if (userSession != null && userSession.isOpen()) {userSession.close();}}
} 
WebSocketContainer container = ContainerProvider.getWebSocketContainer();
ChatdocClientEndpoint endpoint = new ChatdocClientEndpoint(msg -> {try {clientSession.getBasicRemote().sendText(msg);} catch (IOException e) {log.error("[WS] 转发响应失败", e);sendError(clientSession, "转发响应失败: " + e.getMessage());}},() -> {log.error("[WS] chatdoc WebSocket异常");sendError(clientSession, "chatdoc WebSocket异常");}
);
Session chatdocSession = container.connectToServer(endpoint, java.net.URI.create(wsUrl));
endpoint.sendText(requestJson);
http://www.dtcms.com/a/303495.html

相关文章:

  • 【学习路线】Android开发2025:从入门到高级架构师
  • 拓扑排序算法
  • LeetCode 85. 最大矩形
  • Nginx 四层(stream)反向代理 + DNS 负载均衡
  • 回滚日志-undo log
  • Resilience4j 实战—使用方式及配置详解
  • 如何利用机器学习分析筛选生物标记物
  • 【机器学习】第八章 模型评估及改进
  • C++入门自学Day2-- c++类与对象(初识)
  • Redis做混沌测试都需要测哪些场景?预期如何?
  • Java项目:基于SSM框架实现的进销存管理系统【ssm+B/S架构+源码+数据库+毕业论文+远程部署】
  • # Android 15 修改系统源码指定安装源
  • yolo 目标检测600类目标
  • 免费版酒店收银系统弹窗在押金原路退回流程中的应用价值探究 ——仙盟创梦IDE
  • React Router v6 核心组件
  • 关闭 UniGetUI 自动 Pip 更新,有效避免 Anaconda 环境冲突教程
  • 基于Vue3.0+Express的前后端分离的任务清单管理系统
  • Leaflet 综合案例-矢量图层控制
  • 二分查找的「左右为难」:如何优雅地找到数组中元素的首尾位置
  • SQL笔试面试
  • 深入理解 Qt 信号与槽机制的底层逻辑
  • AUTOSAR Mcal SPI - EB工具配置介绍
  • Android Handler 完全指南
  • 手游遇攻击为何要用游戏盾SDK?
  • Linux学习--C语言(指针3)
  • 第三阶段—8天Python从入门到精通【itheima】-139节(pysqark实战-前言介绍)
  • linux du、df命令使用教程
  • AWS Bedrock Claude 3 API的完整指南
  • 基于STM32设计的智慧果园云监测系统_256
  • 从像素到频率:OpenCV傅里叶变换