我的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
已经注册,因为该消息具有误导性,但它确实修复了它。