3

我刚刚使用带有版本 2.0.0.BUILD-SNAPSHOT 的 spring-boot-starter-webflux 创建了一个简单的 Spring Boot 应用程序,它带来了 spring-webflux 版本 5.0.0.BUILD-SNAPSHOT 和 Spring Core、Beans、Context 等。

如果我创建一个简单的@RestController并提供一个@GetMapping简单的返回 a Flux<String>,那么一切都会按预期工作。

但是,如果我从FluxRxJava's更改Observable,我会收到此错误:

org.springframework.web.HttpMediaTypeNotAcceptableException: Could not find acceptable representation

通过代码调试一下,我发现 JacksonObjectMapper以某种方式注册了其 typeFactoryFluxMono的其余反应类型,所以后来MappingJackson2HttpMessageConverter知道如何(反)序列化它们。

但是,当我使用Observable: 我没有找到类型ObservableSingle在 的类型工厂中注册时,情况并非ObjectMapper如此,所以我得到了上述错误。

有没有人遇到过这个问题?我是否缺少任何依赖项?我是否需要手动告诉 Jackson 如何从 RxJava 结构中(反)序列化?但是为什么 Jackson 已经知道 Flux 和 Mono 了?

谢谢你的帮助。

编辑:

我正在使用 RxJava 1.2.7。这是我的 pom.xml:

<dependencies>
    <!-- Spring Boot -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-webflux</artifactId>
        <version>2.0.0.BUILD-SNAPSHOT</version>
    </dependency>
    <!-- RxJava dependeencies -->
    <dependency>
        <groupId>io.reactivex</groupId>
        <artifactId>rxjava</artifactId>
        <version>1.2.7</version>
    </dependency>
</dependencies>

这是我的控制器代码的示例:

/**
 * Get all the available tasks.
 *
 * @return the list of tasks
 */
@GetMapping(path = "/task")
@ResponseStatus(HttpStatus.OK)
public Observable<TaskView> allTasks(@AuthenticationPrincipal LoggedUserVO principal) {
    return this.pocComponent.getAllTasks()
            .map(t -> ViewConverter.convertFromTaskDocument(t, principal));
}
4

2 回答 2

3

您可能缺少以下依赖项以使其正常工作:

<dependency>
    <groupId>io.reactivex</groupId>
    <artifactId>rxjava-reactive-streams</artifactId>
    <version>1.2.1</version>
</dependency>

各种 RxJava 1.x 版本的变化使我们很难开箱即用地支持它,这就是为什么我们更喜欢依赖官方的 RxJava -> Reactive Streams 适配器。请注意,无需额外依赖即可支持 RxJava 2.x(它本机构建在 Reactive Streams 之上)。

我将更新Spring WebFlux 参考文档以指定需要 RxJava 1.x 支持。

于 2017-03-13T12:20:01.750 回答
-7

Spring 的名称也是如此FluxMono因为 Spring 有 Not-Invented-Here 综合症。

您可以注册一个处理程序来转换为 Spring 知道的类型,使用 Jersey 提供的 AsyncResponse 工具,或者在任何地方添加 toBlocking。

于 2017-03-12T20:08:23.920 回答