我遇到以下错误,尝试扩展RuntimeException并使用我的Kotlin代码实现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()
中定义的Throwable
发生冲突。
我无法更改界面的代码,因为它来自库。
如何创建自己的运行时异常,实现GraphQLError?
PS:我也尝试了以下内容,并收到了一个非常类似的错误:
class NegativeCountException(override val message: String?) : RuntimeException(), GraphQLError {
<...>
}
答案 0 :(得分:2)
这是一个graphql问题。我的解决方法:
重新实现GraphQLError,ExceptionWhileDataFetching和DataFetcherErrorHandler。
KGraphQLError是一个用于自定义错误的“固定”kotlin接口(使用val代替getter)。
KDataFetcherErrorHandler中的:将此行中的ExceptionWhileDataFetching
替换为KExceptionWhileDataFetching
:
val error = ExceptionWhileDataFetching(path, exception, sourceLocation)
KExceptionWhileErrorHandling
实施GraphQLError
。查看代码并将if (exception is GraphQLError)
的所有实例替换为(exception is KGraphQLError)
将新的KDataFetcherErrorHandler
传递给您的queryExecutionStrategy和mutationExecutionStrategy。
您的自定义错误现在可以扩展Throwable并实现KGraphQLError,并得到妥善处理。
此处有更多信息:http://graphql-java.readthedocs.io/en/latest/execution.html
答案 1 :(得分:1)
我认为当消息不是一个类(Throwable)中的字段和另一个类中的方法时它会起作用。但是当消息是类中的字段和接口中的方法时,似乎kotlin无法解决模糊性。如果您可以控制GraphQlError,则可以执行以下操作:
class NegativeCountException() : RuntimeException(), GraphQLError {
override val message: String?
get() = super.message
}
interface GraphQLError {
val message: String?
}
答案 2 :(得分:0)
这是因为Kotlin在生成Java字节代码时会为变量创建getter和setter。例如,
class Foo(val bar)
Foo
,Java字节代码中包含getBar
。为避免名称冲突,请使用@JvmField
和@JvmName
。
详细了解此here。
答案 3 :(得分:0)
有一个快速而肮脏的解决方法,以防您的项目允许Java与Kolin一起使用。
用Java编写您的NegativeCountException
:D