如何将 Spring Webflux Websocket 路由作为注释?

Posted

技术标签:

【中文标题】如何将 Spring Webflux Websocket 路由作为注释?【英文标题】:How to have Spring Webflux Websocket route as annotation? 【发布时间】:2021-02-09 02:12:27 【问题描述】:

关于如何将 Spring Webflux Websocket 作为注释的问题。

我正在开发一个 Springboot Webflux Websocket 项目,它可以同时处理 restful api 和 websocket。

强调一下,它是一个单独的 Spring Webflux 项目。不是 Springboot starter websocket,不是 Springboot rsocket,不是 Springboot pub sub。

项目如下:


@SpringBootApplication
public class EchoApplication 
    public static void main(String[] args) 
        SpringApplication.run(EchoApplication.class, args);
    


@RestController
public class EchoController 
    @GetMapping(value = "/getEcho")
    public Mono<String> getEcho() 
        return Mono.just("echo");
    


public class EchoHandler implements WebSocketHandler 
    @Override
    public Mono<Void> handle(WebSocketSession session) 
        return session.send( session.receive().map(msg -> "RECEIVED ON SERVER :: " + msg.getPayloadAsText()).map(session::textMessage));
    


@Configuration
public class EchoConfiguration 

    @Bean
    public EchoHandler echoHandler() 
        return new EchoHandler();
    

    @Bean
    public HandlerMapping handlerMapping() 
        Map<String, WebSocketHandler> map = new HashMap<>();
        map.put("/echo", echoHandler());
        SimpleUrlHandlerMapping mapping = new SimpleUrlHandlerMapping();
        mapping.setUrlMap(map);
        mapping.setOrder(Ordered.HIGHEST_PRECEDENCE);
        return mapping;
    

    @Bean
    public WebSocketHandlerAdapter handlerAdapter() 
        return new WebSocketHandlerAdapter(webSocketService());
    

    @Bean
    public WebSocketService webSocketService() 
        return new HandshakeWebSocketService(new ReactorNettyRequestUpgradeStrategy());
    



    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.3.4.RELEASE</version>
        <relativePath /> <!-- lookup parent from repository -->
    </parent>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-webflux</artifactId>
        </dependency>
    </dependencies>

如您所见,在这个项目中,有“传统”注解@GetMapping(value = "/getEcho")。许多 Spring 项目使用这种样式,它被暴露为注解(事件 rscocket、pub/sub 等...)

如何拥有:

 @Bean
    public HandlerMapping handlerMapping() 
        Map<String, WebSocketHandler> map = new HashMap<>();
        map.put("/echo", echoHandler());
        SimpleUrlHandlerMapping mapping = new SimpleUrlHandlerMapping();
        mapping.setUrlMap(map);

作为注解,某种@WebsocketMapping("/echo") 将有助于提供一种统一且更简洁的方式来查看路由?

谢谢

【问题讨论】:

【参考方案1】:

Spring Team 目前不支持此功能,也没有计划为 Webflux 支持基于路由的 Web 套接字。

【讨论】:

以上是关于如何将 Spring Webflux Websocket 路由作为注释?的主要内容,如果未能解决你的问题,请参考以下文章

如何将使用 RESTFul 的微服务迁移到 Spring Webflux 反应式

如何使用 Spring Boot 对 WebFlux 进行异常处理?

Spring WebFlux WebClient - 如何解决 400 错误请求

Spring WebFlux 教程:如何构建反应式 Web 应用程序

Spring WebFlux,如何调试我的 WebClient POST 交换?

使用 Spring WebFlux 路由器功能时如何获取模型属性?