【问题标题】:Spring Webflux and Observable responses not workingSpring Webflux 和 Observable 响应不起作用
【发布时间】:2017-08-02 14:12:40
【问题描述】:

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

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

但是,如果我从 Flux 更改为 RxJava 的 Observable,我会收到此错误:

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

通过代码调试一下,我发现 Jackson 的 ObjectMapper 以某种方式在其 typeFactory 中注册了 FluxMono 和其他反应类型,所以后来 MappingJackson2HttpMessageConverter 知道如何(反)序列化它们.

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

有人遇到过这个问题吗?我是否缺少任何依赖项?我是否需要手动告诉 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));
}

【问题讨论】:

  • 你能发布你的 pom/gradle 文件吗?您使用的是哪个 RxJava 版本?还请添加一些代码,例如您的控制器。
  • 我会删除 version,因为 spring Boot 已经管理了它,您还需要 rxjava 的 reactive-streams 扩展以使其与 Reactive.io 集成,因为 Reactive Streams 是集成点不同的反应式实现。
  • 如果我删除 RxJava 的版本,我会得到 1.1.8。 reactive-streams 依赖(版本 1.0.0)是通过依赖 spring-boot-starter-webflux 传递获得的。无论如何,仍然无法正常工作。
  • 这很奇怪,因为当我查看 1.2.7 的托管依赖项时......您使用的所有内容都是 Spring Boot 2.0.0 吗?还是您刚刚将此依赖项包含在现有的旧 Spring Boot 版本中?或者简而言之,您可以添加完整的 pom 吗?你需要 rxjava-reactive-streams 依赖...

标签: spring-mvc spring-boot rx-java spring-webflux


【解决方案1】:

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

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

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

我将更新 Spring WebFlux reference documentation 以指定这是获得 RxJava 1.x 支持所必需的。

【讨论】:

  • Sébastien,我在 pom.xml 中添加了新的依赖项,但仍然出现相同的错误。也尝试使用 RxJava2 没有成功。您能否指出您在 Jackson 中“注册” Observable 类型的代码,以便我可以检查它是否真的完成了?谢谢。
  • 到目前为止使用此解决方法:private MappingJackson2HttpMessageConverter jackson2HttpMessageConverter() { ... JsonSerializer&lt;?&gt; s = new StdSerializer&lt;Observable&lt;?&gt;&gt;(Observable.class, true) { @Override public void serialize( Observable&lt;?&gt; obs, JsonGenerator jgen, SerializerProvider p ) throws IOException { provider.findValueSerializer(Iterator.class, null) .serialize(obs.blockingIterable().iterator(), jgen, p); } }; om.registerModule(new SimpleModule("Observable API", Version.unknownVersion(), Arrays.asList(s))); return jackson; }
  • 好的,我今天会深入了解一下
  • 我确认它按照我的回答中的描述工作,请参阅此示例示例github.com/sdeleuze/webflux-rxjava1。你能看看你的项目,看看有什么不同吗?请确保您使用的是spring-boot-starter-webflux 而不是spring-boot-starter-web
  • 我更新了 Spring WebFlux 参考文档,其中包含所需的依赖项详细信息 github.com/spring-projects/spring-framework/commit/…
【解决方案2】:

所以,FluxMono 是 Spring 名称,因为 Spring 有 Not-Invented-Here 综合症。

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

【讨论】:

  • 但是 Spring 的官方文档明确指出它还支持带有 Observable 和 Single 的 RxJava。虽然我不能让它工作。
  • 与其试图抨击框架,不如提供建设性的答案。 (因为这可以被认为是一个答案,因为它并没有真正回答这个问题)。
  • @M.Deinum 我不是在抨击 Spring,我每天都在使用它(识别它增加的价值的最简单方法是在使用 spring 之后尝试使用内部框架)-我'我只是说它倾向于在自己的命名空间中重复概念。
  • 这在我的书中抨击。此外,您可能不想发表该评论,而是要检查为什么在幕后会有反应(实际上有一个很好的理由,它与 not-invented-here 无关)。
猜你喜欢
  • 2018-09-24
  • 1970-01-01
  • 2018-01-08
  • 2020-04-23
  • 1970-01-01
  • 2021-05-02
  • 1970-01-01
  • 2012-03-31
  • 2022-12-15
相关资源
最近更新 更多