Jetty WebSocketException 无法调用方法

Posted

技术标签:

【中文标题】Jetty WebSocketException 无法调用方法【英文标题】:Jetty WebSocketException can not call method 【发布时间】:2015-01-07 21:53:41 【问题描述】:

我正在尝试在 java 中使用 websockets,但遇到了这个问题:

Cannot call method public final void package.ClientWebSocket#jettyOnMessage(byte[], int, int) with args: [[B, java.lang.Integer, java.lang.Integer]

这里是实际调用的代码 sn-p

 @OnWebSocketMessage
 public final void jettyOnMessage(final byte[] data, final int offset, final int length) 
     onMessage(ByteBuffer.wrap(data, offset, length));
 

这里有描述方法签名应该是什么的文档:

 * <u>Binary Message Versions</u>
 * <ol>
 * <li><code>public void methodName(byte buf[], int offset, int length)</code></li>
 * <li><code>public void methodName(@link Session session, byte buf[], int offset, int length)</code></li>
 * <li><code>public void methodName(InputStream stream)</code></li>
 * <li><code>public void methodName(@link Session session, InputStream stream)</code></li>
 * </ol>
 */

如您所知,我使用的是第一个版本的通话。 我做错了什么?

编辑1:

我将方法设为非最终方法,但这并没有改变任何东西。

【问题讨论】:

【参考方案1】:

如果有人遇到类似的异常,我会发现问题。

问题是我的一个方法在内部抛出了一个未捕获的异常。

如果您将整个代码包装在一个 try 中,您可以完全避免这个异常并找到它被抛出的真正原因。

解决问题的代码:

@OnWebSocketMessage
public final void jettyOnMessage(final byte[] data, final int offset, final int length) 
    try 
        onMessage(ByteBuffer.wrap(data, offset, length));
     catch (Exception e) 
        e.printStackTrace();
    

onMessage 可能抛出异常的地方

在我的情况下,它最终成为 ArrayOutOfBoundsException,因为我愚蠢地做 list.get(list.size());

这些小事让你着迷。

【讨论】:

你有这方面的例子吗?我希望在 Jetty 的未来版本中更清楚地显示该错误消息。 我编辑了答案以显示我的实际解决方案代码,但我认为这取决于您如何调用该方法。如果您正在使用反射,那么我认为这将解决它:***.com/questions/9049749/… 这个来自另一个人的帖子似乎找到了一种方法来显示原因***.com/questions/25549072/… 我也在使用jetty-all(来自maven)版本9.2.2.v20140723 创建了 Jetty 错误来跟踪这个...bugs.eclipse.org/bugs/show_bug.cgi?id=457017

以上是关于Jetty WebSocketException 无法调用方法的主要内容,如果未能解决你的问题,请参考以下文章

WebSocketException上的Flutter Socket io错误:连接未升级到websocket

Jetty使用教程——开始使用Jetty

使用 jetty-maven-plugin 运行 Jetty,并在 jetty 运行时完成构建

Jetty9开发

Jetty初探

Jetty容器