使用 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端点?
使用最新版本的 Apollo 和 GraphQL 工具进行远程模式拼接