WebSocket 部署因未注册 X 时"MessageHandler for type x already registered"而失败



我的websocket的@OnMessage方法在部署时生成以下异常:

javax.websocket.DeploymentException: Class test.MyWebsocketEndpoint. MessageHandler for type: class test.MyInput already registered..

据我所知,没有这样的事情!这是我唯一的onmessage事件。

我已经将问题归结为以下SSCCE,该SSCCE是作为一个新项目创建的,并展示了我遇到的问题。

端点:

package test;
import javax.websocket.OnMessage;
import javax.websocket.OnOpen;
import javax.websocket.Session;
import javax.websocket.server.ServerEndpoint;
@ServerEndpoint("/endpoint")
public class MySocketEndpoint
{
    @OnOpen
    public void onOpen(Session session)
    {
    }
    @OnMessage
    public void onMessage(MyInput input)
    {
    }
}

MyInput:

package test;
public class MyInput
{
}

MyInputDecoder:

package test;
import javax.websocket.DecodeException;
import javax.websocket.Decoder;
import javax.websocket.EndpointConfig;
public class MyInputDecoder implements Decoder.Text<MyInput>
{
    @Override
    public MyInput decode(String s) throws DecodeException
    {
        return new MyInput();
    }
    @Override
    public boolean willDecode(String s)
    {
        return true;
    }
    @Override
    public void init(EndpointConfig config)
    {
    }
    @Override
    public void destroy()
    {
    }
}

这里有一些可能有用的信息…

  • 如果我把我的onmessage方法改为onMessage(String),那确实部署得很好,没有任何异常,我可以打印字符串来查看发送到服务器的消息,但如果我把它改回使用MyInput,然后错误返回。
  • 如果我注释掉我的onmessage方法然后重新部署,然后部署工作正常,但显然没有任何消息逻辑。
  • 除了例外情况,项目确实部署了其他资源。后部署时,我可以转到项目包含和的网页查看静态内容。此错误只会中断websocket本身。
  • DeploymentException导致一个ServletException,消息是"Web套接字服务器初始化失败",这反过来又导致一个InstantiationException在堆栈的更上层。

我困惑。由于该方法是唯一使用注释的地方,也是唯一使用MyInput类的地方,那么如何已经注册了处理程序呢?我如何部署使用解码对象的成功onmessage事件?我是否遇到了什么陷阱,或者我错过了什么?

@ServerEndpoint注释需要知道编码器和解码器在哪里。

的例子:

@ServerEndpoint(value="/endpoint", decoders={MyInputDecoder.class})
public class MySocketEndpoint
{
    ...
}

否则,它不知道在哪里找到需要解码的类的解码器。

我不确定为什么这会导致错误声明MyInput已经注册,因为该消息具有误导性,但它确实修复了它。

相关内容

  • 没有找到相关文章

最新更新