【问题标题】:Spring boot 2 reactive web websocket conflict with datarestSpring boot 2 反应式 websocket 与 datarest 冲突
【发布时间】:2018-07-03 01:00:33
【问题描述】:

我正在使用 spring boot 2 创建一个项目并使用 websocket 使用响应式 web 依赖项。在我添加 datarest 依赖项之前,我的应用程序可以正常工作。在我添加 datarest 依赖应用程序后给

' 失败:WebSocket 握手期间出错:意外响应代码:404

有什么办法可以解决这个冲突吗?

pom.xml

<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-integration</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-webflux</artifactId>
    </dependency>
    <!-- https://mvnrepository.com/artifact/org.springframework.integration/spring-integration-file -->
    <dependency>
        <groupId>org.springframework.integration</groupId>
        <artifactId>spring-integration-file</artifactId>
    </dependency>

    <dependency>
        <groupId>org.projectlombok</groupId>
        <artifactId>lombok</artifactId>
        <optional>true</optional>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-data-rest</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-devtools</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-test</artifactId>
        <scope>test</scope>
    </dependency>
    <dependency>
        <groupId>io.projectreactor</groupId>
        <artifactId>reactor-test</artifactId>
        <scope>test</scope>
    </dependency>
</dependencies>

WebSocket配置

@Configuration
public class WebSocketConfiguration {
@Bean
public IntegrationFlow fileFlow(PublishSubscribeChannel channel, @Value("file://${HOME}/Desktop/in") File file) {
    FileInboundChannelAdapterSpec in = Files.inboundAdapter(file).autoCreateDirectory(true);

    return IntegrationFlows.from(
            in,
            p -> p.poller(pollerFactory -> {
                return pollerFactory.fixedRate(1000);
            })
    ).channel(channel).get();
}

@Bean
@Primary
public PublishSubscribeChannel incomingFilesChannel() {
    return new PublishSubscribeChannel();
}

@Bean
public WebSocketHandlerAdapter webSocketHandlerAdapter() {
    return new WebSocketHandlerAdapter();
}

@Bean
public WebSocketHandler webSocketHandler(PublishSubscribeChannel channel) {
    return session -> {
        Map<String, MessageHandler> connections = new ConcurrentHashMap<>();
        Flux<WebSocketMessage> publisher = Flux.create((Consumer<FluxSink<WebSocketMessage>>) fluxSink -> {
            connections.put(session.getId(), new ForwardingMessageHandler(session, fluxSink));
            channel.subscribe(connections.get(session.getId()));
        }).doFinally(signalType -> {
            channel.unsubscribe(connections.get(session.getId()));
            connections.remove(session.getId());
        });
        return session.send(publisher);
    };
}

@Bean
public HandlerMapping handlerMapping(WebSocketHandler webSocketHandler) {
    SimpleUrlHandlerMapping handlerMapping = new SimpleUrlHandlerMapping();
    handlerMapping.setOrder(10);
    handlerMapping.setUrlMap(Collections.singletonMap("/ws/files", webSocketHandler));
    return handlerMapping;
}

}

【问题讨论】:

    标签: spring-boot spring-websocket spring-webflux


    【解决方案1】:

    spring-boot-starter-data-rest 带来 spring-boot-starter-web 作为传递依赖(基本上是 Spring MVC)。这使得 Spring Boot 将您的应用程序配置为 Spring MVC Web 应用程序。

    Spring Data REST 目前不支持 Spring WebFlux (see this issue for more information on that)。

    您唯一的选择是删除 Spring Data REST 依赖项,因为您不能在同一个 Spring Boot 应用程序中同时拥有 Spring MVC 和 Spring WebFlux。

    【讨论】:

      猜你喜欢
      • 2018-06-24
      • 1970-01-01
      • 2023-03-31
      • 2022-10-23
      • 2021-10-26
      • 2017-07-19
      • 1970-01-01
      • 2018-02-21
      • 1970-01-01
      相关资源
      最近更新 更多