如何将 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 应用程序