在 spring-boot 中使用 kotlin 挂起函数创建名称为“requestMappingHandlerMapping”的 bean 时出错

Posted

技术标签:

【中文标题】在 spring-boot 中使用 kotlin 挂起函数创建名称为“requestMappingHandlerMapping”的 bean 时出错【英文标题】:Error creating bean with name 'requestMappingHandlerMapping' with kotlin suspend function in spring-boot 【发布时间】:2020-08-06 10:53:36 【问题描述】:

spring-boot 版本:2.2.6.RELEASE

kotlin 版本:1.3.71

kotlin 协程版本:1.3.5

我正在尝试在 Spring Boot 的控制器中使用暂停功能。 Here 是显示示例的官方文档。

@RestController
@RequestMapping("/account/v1")
class UserAccountResourceV1 
    @GetMapping("/username-taken", produces = [MediaType.TEXT_PLAIN_VALUE])
    suspend fun userNameTaken(): String 
        return "yes"
    

我在 build.gradle.kts 中添加了所需的依赖项:

dependencies 
    implementation("org.springframework.boot:spring-boot-starter-web")
    implementation("org.springframework.boot:spring-boot-starter-jersey")
    implementation("com.fasterxml.jackson.module:jackson-module-kotlin")
    implementation("org.jetbrains.kotlin:kotlin-reflect")
    implementation("org.jetbrains.kotlin:kotlin-stdlib-jdk8")
    developmentOnly("org.springframework.boot:spring-boot-devtools")
    testImplementation("org.springframework.boot:spring-boot-starter-test") 
        exclude(group = "org.junit.vintage", module = "junit-vintage-engine")
    
    implementation(group = "org.jetbrains.kotlinx", name = "kotlinx-coroutines-core", version = "1.3.2")


它在运行时中断并抛出此错误:

org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'requestMappingHandlerMapping' defined in class path resource [org/springframework/boot/autoconfigure/web/servlet/WebMvcAutoConfiguration$EnableWebMvcConfiguration.class]: Invocation of init method failed; nested exception is java.lang.IllegalStateException: Unsupported suspending handler method detected: public java.lang.Object com.example.user.service.resources.UserAccountResourceV1.userNameTaken(kotlin.coroutines.Continuation)

完整的标准错误是here。

需要一些帮助来弄清楚我的实现有什么问题。

【问题讨论】:

【参考方案1】:

想出了解决办法。

implementation("org.springframework.boot:spring-boot-starter-web")

需要替换为

implementation("org.springframework.boot:spring-boot-starter-webflux")

基本上spring-boot-starter-webflux 带来了对暂停功能的支持。

【讨论】:

以上是关于在 spring-boot 中使用 kotlin 挂起函数创建名称为“requestMappingHandlerMapping”的 bean 时出错的主要内容,如果未能解决你的问题,请参考以下文章

JPA 自动完成功能在 Intellij spring-boot kotlin 项目中不起作用

如何启动 2.4.0 和 kotlin 1.4.20

如何在没有 spring-boot 的情况下在 spring-webflux 中加载配置?

Kotlin - 数据类实体抛出 ***Error

使用 spring-boot 的 assemble 创建的 jar 的 Gradle 集名称

带有用户和角色的 Kotlin 中的 Spring Boot 安全性