【发布时间】: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") 将有助于提供一种统一且更简洁的方式来查看路由?
谢谢
【问题讨论】:
标签: java spring-boot websocket spring-webflux