使用 GraphQL Java 工具时 Spring Boot 应用程序无法启动

Posted

技术标签:

【中文标题】使用 GraphQL Java 工具时 Spring Boot 应用程序无法启动【英文标题】:Spring Boot application failed to start when using GraphQL Java Tools 【发布时间】:2021-11-28 18:16:44 【问题描述】:

我刚刚使用GraphQL Java Tools 设置了一个新的Spring Boot 应用程序。我的 Maven pom.xml 文件中的精确版本是:

com.graphql-java-kickstart:graphql-spring-boot-starter:12.0.0 com.graphql-java-kickstart:graphiql-spring-boot-starter:11.1.0 com.graphql-java-kickstart:graphql-java-tools:12.0.0

虽然我的应用程序可以编译,但当我启动我的 Spring Boot 应用程序时,它会失败并出现以下神秘错误:

***************************
APPLICATION FAILED TO START
***************************

Description:

An attempt was made to call a method that does not exist. The attempt was made from the following location:

    graphql.kickstart.tools.resolver.FieldResolverScanner.findResolverMethod(FieldResolverScanner.kt:92)

The following method did not exist:

    'java.lang.String kotlin.text.CharsKt.titlecase(char)'

The method's class, kotlin.text.CharsKt, is available from the following locations:

    jar:file:/C:/Users/c-martind/.m2/repository/org/jetbrains/kotlin/kotlin-stdlib/1.3.61/kotlin-stdlib-1.3.61.jar!/kotlin/text/CharsKt.class

It was loaded from the following location:

    file:/C:/Users/c-martind/.m2/repository/org/jetbrains/kotlin/kotlin-stdlib/1.3.61/kotlin-stdlib-1.3.61.jar


Action:

Correct the classpath of your application so that it contains a single, compatible version of kotlin.text.CharsKt

我使用的是 Java 而不是 Kotlin,所以我不知道为什么 Kotlin 会出现问题。

【问题讨论】:

【参考方案1】:

根据GraphQL Java Tools's README,您需要在 Maven pom.xml 文件的 <properties> 部分中设置 Kotlin 版本:

<properties>
    <kotlin.version>1.5.0</kotlin.version>
</properties>

如果您在 Spring Boot 中使用 graphl-java-tools,您可能会遇到 Kotlin 版本不匹配的问题,因为两者都依赖于 Kotlin。具体来说,Spring Boot Starter 可能会使用低于 GraphQL Java 工具要求的版本覆盖该版本。设置上述属性会将 Kotlin 版本提升到适当的版本。如果您不覆盖此版本,您将遇到类似NoClassDefFoundError 或您在应用程序启动期间遇到的错误。

【讨论】:

以上是关于使用 GraphQL Java 工具时 Spring Boot 应用程序无法启动的主要内容,如果未能解决你的问题,请参考以下文章

graphql-java:如何在以编程方式生成 graphql 模式时添加自定义标量类型?

有没有办法使用spring boot starter app graphql-spring-boot-starter公开2个graphql端点?

GraphQL java:当请求有未使用的变量时抛出异常

使用最新版本的 Apollo 和 GraphQL 工具进行远程模式拼接

使用 graphql-java 构建 Relay GraphQL 服务器

当所有 URL 都相同时,如何在开发工具网络选项卡中区分 GraphQL 请求?