【问题标题】:How to have Spring Webflux Websocket route as annotation?如何将 Spring Webflux Websocket 路由作为注释?
【发布时间】: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


    【解决方案1】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-03-15
      • 2019-10-12
      • 2022-08-06
      • 1970-01-01
      • 2020-06-12
      • 1970-01-01
      • 2015-07-03
      • 2023-03-18
      相关资源
      最近更新 更多