Kotlin和Java中的RuntimeException和GraphQLError

时间:2018-07-05 07:08:07

标签: java kotlin graphql

我尝试使用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()方法。

谢谢!

2 个答案:

答案 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签名。在我看来,当前的现状是属性访问器没有被视为单个成员,因此它们不能被成员函数覆盖,甚至不能实现抽象函数。我不确定为什么会这样。