我尝试使用GraphQL和Kotlin开发REST API,但遇到了以下问题:我尝试创建一个自定义Exception,它扩展RuntimeException并实现GraphQLError,在Kotlin中,我无法做到这一点,因为我收到了此消息:Accidental override when using third party Java interface and extending RuntimeException in kotlin。
我通过为我的CustomException创建Java类来解决此问题。
但是我不知道为什么,当我创建一个扩展RuntimeException
并实现GraphQLError
的kotlin类时,我需要从GraphQLError覆盖getMessage()
方法,但是当我创建一个扩展RuntimeException并实现GraphQLError的Java类,我不需要重写GraphQLError的getMessage()
方法。
谢谢!
答案 0 :(得分:3)
使用@JvmField注释消息,例如:
class MyError(@JvmField override val message: String?, private val invalidField: String? = null) : RuntimeException(message), GraphQLError {
override fun getMessage(): String = super.message ?: "no error message set"
override fun getLocations(): List<SourceLocation> = emptyList()
override fun getErrorType(): ErrorType = ErrorType.DataFetchingException
override fun getExtensions(): Map<String, Any> = if(invalidField!=null)
Collections.singletonMap<String, Any>("invalidField", invalidField)
else
Collections.emptyMap()
}
答案 1 :(得分:1)
似乎似乎尚不支持使用函数覆盖属性访问器。根据您的链接,当前是一个错误。可以通过一个简单的示例轻松验证这一点:
class Sample(val message : String) {
fun getMessage() :String = "MyString"
}
之所以会发生这种情况,是因为属性message
(在您的情况下为Throwable
的消息)和getMessage
函数(在您的情况下为GraphQL的getMessage
)会转换相同的JVM签名。在我看来,当前的现状是属性访问器没有被视为单个成员,因此它们不能被成员函数覆盖,甚至不能实现抽象函数。我不确定为什么会这样。