Spring WebFlux Reactive 和 Kotlin Coroutines 启动错误

Posted

技术标签:

【中文标题】Spring WebFlux Reactive 和 Kotlin Coroutines 启动错误【英文标题】:Spring WebFlux Reactive and Kotlin Coroutines Startup Error 【发布时间】:2020-07-16 20:26:38 【问题描述】:

无论我如何设置我的项目,我都会在启动时遇到以下异常:

“检测到不支持的挂起处理程序方法”。

我正在尝试使用https://docs.spring.io/spring/docs/5.2.0.BUILD-SNAPSHOT/spring-framework-reference/languages.html#coroutines 中描述的对协程的支持。

这是我的 gradle 设置(缩写)。如何摆脱这个异常?

ext.kotlin_version = '1.3.70'
ext.kotlin_coroutines_core = '1.3.5'
ext.kotlin_coroutines_reactor = '1.3.5'
ext.spring_boot_version = '2.2.6.RELEASE'
ext.springfox_version='2.9.2'
ext.jackson_module_kotlin = '2.10.3'
...

implementation "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version"
implementation "org.jetbrains.kotlinx:kotlinx-coroutines-core:$kotlin_coroutines_core"
implementation "org.jetbrains.kotlinx:kotlinx-coroutines-reactor:$kotlin_coroutines_reactor"
implementation "org.springframework.boot:spring-boot-starter-webflux:$spring_boot_version"
implementation "com.fasterxml.jackson.module:jackson-module-kotlin:$jackson_module_kotlin"
implementation "net.rakugakibox.spring.boot:logback-access-spring-boot-starter:2.7.1"
implementation "net.logstash.logback:logstash-logback-encoder:5.3"
implementation "org.springframework.boot:spring-boot-starter-actuator:$spring_boot_version"
implementation "io.micrometer:micrometer-registry-statsd:1.1.4"
implementation "io.springfox:springfox-swagger2:$springfox_version"

【问题讨论】:

【参考方案1】:

这可能是因为当类路径中同时存在 Spring MVC 和 Spring WebFlux 时,Spring Boot 使用 Spring MVC 服务器,因为 Spring WebFlux 还包含可以与两个服务器一起使用的WebClient

当您使用 spring-boot-starter-webflux 和在类路径中引入传递 Spring MVC 的依赖项(此处为 springfox-swagger2)时,通常会发生这种情况。

application.properties(或application.yml 的等效项)中设置spring.main.web-application-type=reactive 将强制使用WebFlux 服务器并可能避免此问题。

请注意,从 Spring Framework 5.3 和 Spring Boot 2.4 开始,Spring MVC 也支持协程(使用内部 MVC 异步支持),因此在这些版本中您不会出现此错误,但您将使用 Spring MVC 而不是 Spring WebFlux可能不是你想要的。因此,即使使用 Spring Boot 2.4+,如果您想使用 Spring WebFlux 以及可传递 Spring MVC 的依赖项,您也应该设置 spring.main.web-application-type=reactive

【讨论】:

【参考方案2】:

我在这里几个小时都遇到了同样的问题。

我解决这个问题的方法是不使用@RequestMapping 注解。

删除该注释并将@RequestMapping 值向下移动到@GetMapping 和@PostMappings 等工作。无论如何都不是一个好的解决方案,但到目前为止我发现的唯一一个。

问题似乎来自 Spring MVC,在代码中添加了一个用于暂停功能的检查,我猜这是与 WebFlux 共享的: https://github.com/spring-projects/spring-framework/issues/23585

【讨论】:

听起来很奇怪,请分享一个repro项目,我去看看。 您介意分享您的控制器和依赖项吗?我开始使用 GetMapping。

以上是关于Spring WebFlux Reactive 和 Kotlin Coroutines 启动错误的主要内容,如果未能解决你的问题,请参考以下文章

Spring Webflux - 02 Reactive介绍

Spring Webflux - 02 Reactive介绍

Spring Webflux - 02 Reactive介绍

使用 Spring Boot WebFlux、Spring Data MongoDB Reactive 和 ReactiveMongoRepository 更新 1 个或多个特定字段 MongoDB

Spring Reactive WebFlux - 如何自定义 BadRequest 错误消息

Spring Reactive Programming with Webflux - 多个操作作为非阻塞流