【发布时间】: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 中注册了 Flux、Mono 和其他反应类型,所以后来 MappingJackson2HttpMessageConverter 知道如何(反)序列化它们.
但是,当我使用Observable 时,情况并非如此:我没有找到ObjectMapper 的类型工厂中注册的类型Observable 或Single,所以我得到了上述错误。
有人遇到过这个问题吗?我是否缺少任何依赖项?我是否需要手动告诉 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