13

我在尝试从我的 Kotlin 代码扩展 RuntimeException 并实现用 Java 定义的GraphQLError接口时遇到了以下错误。这是错误:

意外覆盖:以下声明具有相同的 JVM 签名 (getMessage()Ljava.lang.string;):

public open fun <get-message>(): String? defined in NegativeCountException public open fun getMessage(): String? defined in NegativeCountException

以下是我的代码:

class NegativeCountException() : RuntimeException(), GraphQLError {
  override fun getMessage(): String? {
    TODO("not implemented")
  }
  <...>
}

其中GraphQLError是一个接口,在 Java 中定义,如下所示:

public interface GraphQLError {
  String getMessage();
  <...>
}

似乎它与getMessage()定义的 in冲突Throwable

我无法更改接口的代码,因为它来自库。

如何创建自己的运行时异常,以实现GraphQLError


PS:我也尝试了以下,并收到了一个非常相似的错误:

class NegativeCountException(override val message: String?) : RuntimeException(), GraphQLError {
  <...>
}
4

5 回答 5

2

这是一个graphql问题。我的解决方法:

重新实现 GraphQLError、ExceptionWhileDataFetching 和 DataFetcherErrorHandler。

KGraphQLError 是用于自定义错误的“固定”kotlin 接口(使用 val 而不是 getter)。

在 KDataFetcherErrorHandlerExceptionWhileDataFetching中:将此行替换为KExceptionWhileDataFetching
val error = ExceptionWhileDataFetching(path, exception, sourceLocation)

KExceptionWhileErrorHandling实现GraphQLError。查看代码并将所有实例替换if (exception is GraphQLError)(exception is KGraphQLError)

将 new 传递KDataFetcherErrorHandler给您的 queryExecutionStrategy 和 mutationExecutionStrategy。

您的自定义错误现在可以扩展 Throwable 并实现 KGraphQLError,并得到正确处理。

更多信息在这里: http: //graphql-java.readthedocs.io/en/latest/execution.html

于 2018-05-18T12:42:45.203 回答
1

当消息不是一个类(Throwable)中的字段和另一个类中的方法时,我认为它会起作用。但是当 message 是类中的字段和接口中的方法时,似乎 kotlin 无法解决歧义。如果您可以控制 GraphQlError,您可以这样做:

class NegativeCountException() : RuntimeException(), GraphQLError {
    override val message: String?
        get() = super.message
}

interface GraphQLError {
    val message: String?
}
于 2018-02-10T11:12:58.977 回答
0

有一个快速而肮脏的解决方法,以防你的项目允许 Java 和 Kolin。用Java写你NegativeCountException的:D

于 2020-10-05T05:40:20.930 回答
0

实际上有一个很好的解决方案(在此处提供):

class NegativeCountException(@JvmField override val message: String) : RuntimeException(message), GraphQLError {
    override fun getMessage(): String? = super.message
  <...>
}
于 2022-02-15T17:31:40.363 回答
0

这是因为 Kotlin 在生成 Java 字节码时会为你的变量创建 getter 和 setter。例如,

class Foo(val bar)

Foo带有getBarJava 字节码。为避免名称冲突,请使用@JvmFieldand @JvmName

在此处阅读有关此内容的更多信息。

于 2018-02-09T05:29:51.147 回答