Websocket 1.0 WebSocketServlet替换

mav*_*rik 3 java websocket servlet-3.0 tomcat7

我正在尝试采用使用的旧代码(现已弃用)WebSocketServlet.旧代码如下所示:

@Singleton
ExampleServlet extends WebSocketServlet {
    @Override
    protected StreamInbound createWebSocketInbound(String subProtocol, HttpServletRequest request) {
        // Do something
        // ...

        return // StreamInbound impl;
    }
}
Run Code Online (Sandbox Code Playgroud)

正如我在较新版本的tomcat 7中所说,从tomcat 8(WebSocket 1.0,Tyrus)向后移植了WebSocket实现,并且WebSocketServlet不推荐使用类.

我应该用什么代替用更新的API部署我的servlet?

小智 5

关于KIC的答案 - 并不是所有需要的.
由于JSR356应该与Tomcat 8.*一起使用,因此您需要修改您的类:

class MyWebSocket extends WebSocketServlet
Run Code Online (Sandbox Code Playgroud)

至:

import javax.websocket.server.ServerEndpoint;

@ServerEndpoint(value="/your-websocket-endpoint")
class MyWebSocket
Run Code Online (Sandbox Code Playgroud)

然后,由于StreamInbound在Tomcat 8.*中也不推荐使用,因此您需要编写自己的方法来处理打开,关闭,错误和消息事件:

import javax.websocket.OnClose;
import javax.websocket.OnError;
import javax.websocket.OnMessage;
import javax.websocket.OnOpen;
import javax.websocket.Session;

@OnOpen
void onOpen(Session session) { }

@OnClose
void onClose(Session session) { }

@OnMessage
void onMessage(Session session, String message) { }

@OnError
void onError(Session session, Throwable throwable) { }
Run Code Online (Sandbox Code Playgroud)

最后,Tomcat已经提供了javax.websocket.*类,它不应该包含在您的应用程序中.对于Maven依赖是:

<dependency>
    <groupId>javax.websocket</groupId>
    <artifactId>javax.websocket-api</artifactId>
    <version>1.0</version>
    <scope>provided</scope>
</dependency>
Run Code Online (Sandbox Code Playgroud)

而对于Gradle是:

providedCompile 'javax.websocket:javax.websocket-api:1.0'
Run Code Online (Sandbox Code Playgroud)

请参阅相关帖子 Tomcat 8和Websocket.