我刚刚使用spring-boot-starter-webflux创建了一个简单的Spring Boot应用程序,版本为2.0.0.BUILD- SNAPSHOT,其中引入了spring-webflux版本5.0.0.BUILD-SNAPSHOT,对于Spring Core,Beans,Context等也是如此。
如果我创建一个简单的@RestController并提供一个@GetMapping简单地返回a的a Flux<String>,那么一切都会按预期进行。
@RestController
@GetMapping
Flux<String>
但是,如果从更改Flux为RxJava Observable,则会出现此错误:
Flux
Observable
org.springframework.web.HttpMediaTypeNotAcceptableException: Could not find acceptable representation
通过代码的调试,我发现Jackson会ObjectMapper以某种方式注册Flux,Mono而其余的反应性类型会在其typeFactory中注册,因此后来MappingJackson2HttpMessageConverter知道了如何对它们进行反序列化。
ObjectMapper
Mono
MappingJackson2HttpMessageConverter
但是,当我使用an时并非如此Observable:我找不到类型Observable或未Single在ObjectMapper类型工厂中注册,因此出现上述错误。
Single
有人遇到过这个问题吗?我会缺少依赖吗?我是否需要手动告诉Jackson如何从RxJava构造中进行(反)序列化?但是,杰克逊为什么已经了解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)); }
您可能缺少以下依赖项才能使其起作用:
<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,而无需其他依赖项(它本机构建在响应流之上)。
我将更新Spring WebFlux参考文档,以指定具有RxJava 1.x支持所需。