JAVAX JSR 356 Websocket 与 Spring Boot

标签 java spring-boot websocket

我正在尝试在 Spring Boot 项目中使用 Javax JSR 356 API 实现服务器端 Websocket 端点。我正在关注this教程。我知道关于这个主题有人问了一些问题,但我无法找到合理的解决方案。当我尝试使用客户端(ARC)连接到 websocket 时,它只报告“发生未知错误”。我检查了嵌入式 Tomcat 服务器的日志,但没有任何条目。根据 Tomcat 启动条目,应用程序的上下文路径为空 (""),因此我确信我使用正确的 URI 访问 websocket。

这是我的代码:

@ServerEndpoint(value = "/socket", configurator = SpringConfigurator.class)
public class WebSocketController
{
    @OnOpen
    public void onOpen(Session session) throws IOException
    {
        System.out.println("Socket has been opened: " + session.getId());
    }

    @OnClose
    public void onClose(Session session) throws IonException
    {
        System.out.println("Socket has been closed: " + session.getId());
    }
}

Spring configuration class
@Configuration
public class WebSocketConfig
{
    @Bean
    public WebSocketController webSocketController()
    {
        return new WebSocketController();
    }

    @Bean
    public ServletContextAware endpointExporterInitializer(final ApplicationContext applicationContext) {
        return new ServletContextAware() {

            @Override
            public void setServletContext(ServletContext servletContext) {
                ServerEndpointExporter serverEndpointExporter = new ServerEndpointExporter();
                serverEndpointExporter.setApplicationContext(applicationContext);
                try {
                    serverEndpointExporter.afterPropertiesSet();
                } catch (Exception e) {
                    throw new RuntimeException(e);
                }
            }
        };
    }
}

如何在 Spring Boot 应用程序中实现服务器端 Websocket 端点?

更新: 按照第一个答案后,Tomcat服务器的日志。一开始就停止。

2018-08-16 00:16:37.160  INFO 12944 --- [           main] o.s.w.s.s.s.ServerEndpointExporter       : Registering @ServerEndpoint class: class io.ai.vivid.zen.controller.WebSocketController
2018-08-16 00:16:37.169  INFO 12944 --- [           main] o.apache.catalina.core.StandardService   : Stopping service [Tomcat]
2018-08-16 00:16:37.170 DEBUG 12944 --- [cat-startStop-1] o.apache.catalina.mapper.MapperListener  : Unregister host [localhost] at domain [null] for service [StandardService[Tomcat]]
2018-08-16 00:16:37.170 DEBUG 12944 --- [ost-startStop-1] o.apache.catalina.mapper.MapperListener  : Unregister Context [] for service [StandardService[Tomcat]]
2018-08-16 00:16:37.170 DEBUG 12944 --- [ost-startStop-1] o.apache.catalina.mapper.MapperListener  : Unregister Wrapper [default] in Context [] for service [StandardService[Tomcat]]
2018-08-16 00:16:37.170 DEBUG 12944 --- [ost-startStop-1] o.apache.catalina.mapper.MapperListener  : Unregister Wrapper [dispatcherServlet] in Context [] for service [StandardService[Tomcat]]
2018-08-16 00:16:37.170 DEBUG 12944 --- [ost-startStop-1] o.a.c.c.C.[Tomcat].[localhost].[/]       : Stopping filters
2018-08-16 00:16:37.170 DEBUG 12944 --- [ost-startStop-1] o.a.c.c.C.[Tomcat].[localhost].[/]       :  Stopping filter 'requestContextFilter'
2018-08-16 00:16:37.171 DEBUG 12944 --- [ost-startStop-1] o.a.c.core.ApplicationFilterConfig       : JMX de-registration complete for filter of type [org.springframework.boot.web.servlet.filter.OrderedRequestContextFilter] and name [requestContextFilter]
2018-08-16 00:16:37.171 DEBUG 12944 --- [ost-startStop-1] o.a.c.c.C.[Tomcat].[localhost].[/]       :  Stopping filter 'Tomcat WebSocket (JSR356) Filter'
2018-08-16 00:16:37.171 DEBUG 12944 --- [ost-startStop-1] o.a.c.core.ApplicationFilterConfig       : JMX de-registration complete for filter of type [org.apache.tomcat.websocket.server.WsFilter] and name [Tomcat WebSocket (JSR356) Filter]
2018-08-16 00:16:37.171 DEBUG 12944 --- [ost-startStop-1] o.a.c.c.C.[Tomcat].[localhost].[/]       :  Stopping filter 'httpPutFormContentFilter'
2018-08-16 00:16:37.171 DEBUG 12944 --- [ost-startStop-1] o.a.c.core.ApplicationFilterConfig       : JMX de-registration complete for filter of type [org.springframework.boot.web.servlet.filter.OrderedHttpPutFormContentFilter] and name [httpPutFormContentFilter]
2018-08-16 00:16:37.171 DEBUG 12944 --- [ost-startStop-1] o.a.c.c.C.[Tomcat].[localhost].[/]       :  Stopping filter 'hiddenHttpMethodFilter'
2018-08-16 00:16:37.171 DEBUG 12944 --- [ost-startStop-1] o.a.c.core.ApplicationFilterConfig       : JMX de-registration complete for filter of type [org.springframework.boot.web.servlet.filter.OrderedHiddenHttpMethodFilter] and name [hiddenHttpMethodFilter]
2018-08-16 00:16:37.171 DEBUG 12944 --- [ost-startStop-1] o.a.c.c.C.[Tomcat].[localhost].[/]       :  Stopping filter 'characterEncodingFilter'
2018-08-16 00:16:37.171 DEBUG 12944 --- [ost-startStop-1] o.a.c.core.ApplicationFilterConfig       : JMX de-registration complete for filter of type [org.springframework.boot.web.servlet.filter.OrderedCharacterEncodingFilter] and name [characterEncodingFilter]
2018-08-16 00:16:37.171 DEBUG 12944 --- [ost-startStop-1] o.a.catalina.session.StandardManager     : Stopping
2018-08-16 00:16:37.171 DEBUG 12944 --- [ost-startStop-1] o.a.catalina.session.StandardManager     : Unloading persisted sessions
2018-08-16 00:16:37.171 DEBUG 12944 --- [ost-startStop-1] o.a.catalina.session.StandardManager     : No persisted sessions to unload
2018-08-16 00:16:37.171 DEBUG 12944 --- [ost-startStop-1] o.apache.catalina.core.StandardContext   : Sending application stop events
2018-08-16 00:16:37.172 DEBUG 12944 --- [ost-startStop-1] o.apache.catalina.core.StandardContext   : Processing standard container shutdown
2018-08-16 00:16:37.172 DEBUG 12944 --- [ost-startStop-1] org.apache.catalina.loader.WebappLoader  : Stopping this Loader
2018-08-16 00:16:37.172 DEBUG 12944 --- [ost-startStop-1] o.a.c.loader.WebappClassLoaderBase       : getResourceAsStream(org/apache/catalina/loader/JdbcLeakPrevention.class)
2018-08-16 00:16:37.172 DEBUG 12944 --- [ost-startStop-1] o.a.c.loader.WebappClassLoaderBase       :   Delegating to parent classloader jdk.internal.loader.ClassLoaders$AppClassLoader@28c97a5
2018-08-16 00:16:37.175 DEBUG 12944 --- [ost-startStop-1] o.a.c.loader.WebappClassLoaderBase       :   --> Returning stream from parent
2018-08-16 00:16:37.183 DEBUG 12944 --- [ost-startStop-1] o.apache.catalina.core.StandardContext   : resetContext Tomcat:j2eeType=WebModule,name=//localhost/,J2EEApplication=none,J2EEServer=none
2018-08-16 00:16:37.183 DEBUG 12944 --- [ost-startStop-1] o.apache.catalina.core.StandardContext   : Stopping complete

最佳答案

我的 Websocket 配置的工作方式如下:

@Configuration
@EnableWebSocket
public class WebSocketConfiguration implements WebSocketConfigurer {

    @Override
    public void registerWebSocketHandlers(WebSocketHandlerRegistry registry) {
        //registry.addHandler(unitWebSocketHandler, "/unit").setAllowedOrigins("*");
    }

    @Bean
    public WebSocketController webSocketController() {
        return new WebSocketController();
    }

    @Bean
    public ServerEndpointExporter serverEndpointExporter() {
        return new ServerEndpointExporter();
    }
}

然后删除configurator = SpringConfigurator.class

所以你的端点看起来像这样:

@ServerEndpoint(value = "/socket")
public class WebSocketController

示例项目可在 GitHub 上找到: https://github.com/simasch/spring-boot-websocket

关于JAVAX JSR 356 Websocket 与 Spring Boot,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51858597/

相关文章:

java - 原因是什么

java - SWT WizardDialog 未显示在任务栏中

java - 如何利用redis提供的数据ID快速查询Oracle中的数据

tomcat部署文件后出现java.io.FileNotFoundException : src\main\resources\Report\testQuery. xlsx(系统找不到指定的路径)

firefox - mozwebsocket数据包结构

Java - javax.websocket.Session 和 javax.servlet.http.HttpSession 使用相同的 JSESSIONID 吗?

java - 读取文件并根据多个条件剪切每一行

java - 这个Spring Boot程序的工作流程是怎样的

spring boot - 计算字段

javascript - Websockets 使用 asio c++ 库作为服务器和 javascript 作为客户端