Spring boot 2反应式web websocket与datarest冲突

问题描述 投票:2回答:1

我正在使用spring boot 2创建项目并使用websocket使用反应式Web依赖项。我的应用程序正常工作,直到我添加datarest依赖项。在我添加datarest依赖应用程序后给出

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

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

pom.hml

<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个回答
1
投票

spring-boot-starter-data-restspring-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。

© www.soinside.com 2019 - 2024. All rights reserved.