当前位置: 首页 > 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.lryc.cn/news/602486.html

相关文章:

  • nginx日志分割
  • Webhook技术深度解析:从原理到实现全指南
  • Cloudflare CDN 中设置地域限制并返回特定界面
  • DNF 与 YUM 的区别详解:从 CentOS 7 到 CentOS 9 的演进
  • nuttx串口驱动框架设计
  • HCIP笔记(第一、二章)
  • 设计模式(十六)行为型:解释器模式详解
  • 自定义View学习记录 plinko游戏View
  • 6、CentOS 9 安装 Docker
  • 状态反馈极点配置
  • 第三阶段—8天Python从入门到精通【itheima】-139节(pysqark实战-前言介绍)
  • mac电脑如何关闭防火墙
  • 本地大语言模型部署指南
  • 分布式渲染效能探析:关键网络性能要素
  • 前端基础之《Vue(25)—Vue3简介》
  • NSGA-II(Non-dominated Sorting Genetic Algorithm II) 算法求解 ZDT1 双目标优化问题
  • 【Java基础面试题】Java特点,八种基本数据类型
  • 【Zustand】从复杂到简洁:Zustand 状态管理简化实战指南
  • GTSuite许可证兼容性及要求
  • 【数据标注】详解使用 Labelimg 进行数据标注的 Conda 环境搭建与操作流程
  • 修改gitlab默认的语言
  • GitLab 18.2 发布几十项与 DevSecOps 有关的功能,可升级体验【四】
  • Java面试深度剖析:从JVM到云原生的技术演进
  • opencv学习(轮廓检测)
  • OpenCV(05)直方图均衡化,模板匹配,霍夫变换,图像亮度变换,形态学变换
  • UE5 UI自适应 DPI缩放
  • 【Spring WebFlux】 三、响应式流规范与实战
  • android-屏幕-刷新流程
  • 《深入剖析Kafka分布式消息队列架构奥秘》之Kafka基本知识介绍
  • MCU 中的 PWM(脉冲宽度调制)是什么?