Android端集成CometD客户端运行报错:Could not find an implementation class
报错原因
- 你使用的
org.cometd.java:cometd-java-client-websocket-javax依赖基于JSR 356标准的WebSocket实现,这套规范属于Jakarta EE(原Java EE)体系,Android系统本身没有内置对应的实现类,运行时调用ContainerProvider.getWebSocketContainer()自然找不到对应实现触发崩溃。 - 你同时引入了okhttp和javax两套CometD WebSocket客户端依赖,存在不必要的冗余,Android平台适配okhttp实现即可满足需求。
解决步骤
1. 调整依赖配置
删除javax相关的CometD依赖,仅保留okhttp版本的依赖:
val androidMain by getting { dependencies { implementation("org.cometd.java:cometd-java-client-websocket-okhttp:7.0.5") } }
2. 修改CometD初始化逻辑
替换原有的JSR 356相关导入和初始化代码,使用okhttp版本的WebSocketTransport:
package com.roxorgaming.kotlinheadlessspike import okhttp3.OkHttpClient import org.cometd.client.BayeuxClient import org.cometd.client.websocket.okhttp.OkHttpClientWebSocketTransport import org.cometd.client.transport.ClientTransport actual class CometdConnection actual constructor() { private lateinit var bayeuxClient: BayeuxClient actual fun initialise() { // 创建OkHttpClient实例,可按需配置超时、拦截器等参数 val okHttpClient = OkHttpClient.Builder() .build() // 初始化CometD OkHttp WebSocket传输层 val wsTransport: ClientTransport = OkHttpClientWebSocketTransport(null, null, okHttpClient) // 配置BayeuxClient bayeuxClient = BayeuxClient("http://localhost:8080/cometd", wsTransport) } actual fun handshake() { // 与服务端进行握手,该操作为异步,建议添加监听判断握手结果后再执行后续操作 bayeuxClient.handshake() } }
额外提示:如果使用Android模拟器访问本地开发的CometD服务,需要将连接地址中的
localhost替换为10.0.2.2才能正常连通电脑本地的服务。
内容的提问来源于stack exchange,提问作者Digvijay Upadhyay
相关产品推荐
相关产品推荐

