我刚刚使用带有版本 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>
,那么一切都会按预期工作。
但是,如果我从Flux
RxJava's更改Observable
,我会收到此错误:
org.springframework.web.HttpMediaTypeNotAcceptableException: Could not find acceptable representation
通过代码调试一下,我发现 JacksonObjectMapper
以某种方式注册了其 typeFactoryFlux
中Mono
的其余反应类型,所以后来MappingJackson2HttpMessageConverter
知道如何(反)序列化它们。
但是,当我使用Observable
: 我没有找到类型Observable
或Single
在 的类型工厂中注册时,情况并非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));
}