Websocket客户端找不到实现类。

21

首先声明,我没有使用任何Maven依赖项,但我知道我缺少一个jar文件wls-api.jar(至少我是这样读到的)。

为了解决这个问题,我下载了oracle-weblogic-7.9.jar,但问题仍然存在。

异常抛出在这一行:

 WebSocketContainer container = ContainerProvider.getWebSocketContainer();

有人能告诉我为什么这行代码一直失败吗?

更新:在进一步阅读示例后,我发现使用了这个依赖项。

<dependency>
<groupId>javax.websocket</groupId>
<artifactId>javax.websocket-api</artifactId>
<version>1.0</version>

我在服务器和客户端的构建路径中包含了javax.websocket-api.jar,因为它是必需的。我错过了什么?

其他更新:我忘记包括抛出的错误!

Exception in thread "main" java.lang.RuntimeException: Could not find an implementation class.
at javax.websocket.ContainerProvider.getWebSocketContainer(ContainerProvider.java:73)
at connect.<init>(connect.java:21)
at test.main(test.java:11)

代码会抛出什么异常?缺少依赖项可能仍然是一个问题。 - James Taylor
非常抱歉,我已经更新了我的问题,包括一些更多的信息以及抛出的异常! - Michael Miner
4个回答

40

javax.websocket API仅为规范,没有完整的实现,您可能需要获取jar文件tyrus-standalone-client-1.9.jar并尝试相同的示例,这应该可以解决您的问题。我使用我的示例进行了测试,一切正常。

希望这可以帮助到您。


很不幸,你是对的,我最终做的是制作一个使用JavaScript作为客户端的网页。我还有一个使用Autobahn WebSockets API的手机应用程序,可以用作客户端。 - Michael Miner

4
我认为你所遇到的RuntimeException幸运地并非由你自己的直接编码错误引起。
正如这里所描述的那样,方法getWebSocketContainer()只是尝试加载其他类并获取服务器中ContainerProvider的静态实例。

该方法按照META-INF/services/javax.websocket.ContainerProvider文件中列出的顺序查找ContainerProvider实现类,并从不为nullContainerProvider实现中返回WebSocketContainer实现。

不幸的是,这意味着你的项目配置不正确。请仔细检查是否在项目的构建路径中包含了此文件。
如果你看到的其他项目正在使用你所描述的Maven依赖项,我建议你尝试设置你的项目以执行相同的操作。
希望对你有所帮助!

在构建路径中,我有javax.websocket-api-1.1.jar,我是否还需要将其放入lib文件夹中?据我所知,这个jar包含ContainerProvider。 - Michael Miner
我认为lib文件夹不是标准的东西,但你可以尝试一下看看是否有效。 - James Taylor
我已经设置了几个项目,但总是得到相同的异常。 - Michael Miner
我还有一个快速问题要问你,你认为设置不当的项目是服务器还是客户端? - Michael Miner
我的猜测是ContainerProvider将参与客户端实现,因为有一个特定的服务器端实现扩展了它。 - James Taylor
好的,我的客户端不工作了,也许手机应用程序连接到我的服务器会更顺利。 - Michael Miner

4

2

错误"无法找到实现类"表明您的类路径上没有一个发布了ContainerProvider实现的JAR,通过META-INF/services/javax.websocket.ContainerProvider文件。

一个可能不与特定容器绑定的客户端实现是tyrus-container-jdk-client包,也可作为tyrus-standalone-client-jdk包的依赖和websocket-api捆绑在一起。

请注意,Tyrus的1.x版本使用来自Java EE的javax.websocket API,而2.x版本使用其后继者Jakarta EEjakarta.websocket。因此,如果您使用的Tyrus版本与您正在使用的websocket API不兼容,则也会出现错误。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接