javax.websocket客户端运行报找不到实现类与空指针异常如何解决?
错误原因
你遇到的两个报错都是常见的javax.websocket客户端接入问题,和connectToServer找ServerEndpoint无关,是以下两个问题导致:
- 第一个错误
Could not find an implementation class:javax.websocket包只定义了标准API,没有包含具体实现,运行时找不到可用的WebSocket容器实现。 - 第二个空指针错误:
ContainerProvider.getWebSocketContainer()调用已经抛出异常终止,后续相关调用自然触发空指针;同时你代码里的connectToServer参数传错,即使加了实现也会报错。
修复步骤
1. 引入WebSocket客户端实现
主流的实现是Oracle开源的Tyrus,在构建配置中添加依赖即可:
- Maven配置:
<dependencies> <!-- WebSocket API --> <dependency> <groupId>javax.websocket</groupId> <artifactId>javax.websocket-client-api</artifactId> <version>1.1</version> </dependency> <!-- Tyrus客户端实现 --> <dependency> <groupId>org.glassfish.tyrus.bundles</groupId> <artifactId>tyrus-standalone-client</artifactId> <version>1.19</version> </dependency> </dependencies>
- Gradle配置:
dependencies { implementation 'javax.websocket:javax.websocket-client-api:1.1' implementation 'org.glassfish.tyrus.bundles:tyrus-standalone-client:1.19' }
2. 修正代码中的参数错误
你在匿名Runnable内部调用container.connectToServer(this, endpointURI)时,this指向的是当前Runnable匿名类实例,不是加了@ClientEndpoint注解的WebsocketClient实例,需要修改为:
// 把这行 container.connectToServer(this, endpointURI); // 替换为 container.connectToServer(WebsocketClient.this, endpointURI);
3. 可选优化建议
- 新增
@OnError注解的异常处理方法,避免未捕获异常直接挂掉线程:
@OnError public void onError(Session session, Throwable throwable) { throwable.printStackTrace(); // 这里可以加自定义的异常处理逻辑 }
- 连接逻辑的异常不要直接抛出RuntimeException,建议增加重试或者状态标记逻辑,方便上层判断连接状态。
验证
修复完成后启动客户端,@OnOpen注解的onOpen方法会被正常回调,此时即可正常调用sendMessage发送消息。
内容的提问来源于stack exchange,提问作者Andy725
相关产品推荐
相关产品推荐

