RuntimeException и GraphQLError в Kotlin и Java

Я пытаюсь разработать REST API с GraphQL и Kotlin, и я столкнулся со следующей проблемой: я пытаюсь создать собственное исключение, которое расширяет RuntimeException и реализует GraphQLError, а в Kotlin я не могу этого сделать, потому что получаю это: Случайное переопределение при использовании стороннего интерфейса Java и расширение RuntimeException в kotlin.

Я решил эту проблему с помощью обходного пути, создав класс Java для моего CustomException.

Но я не знаю, почему, когда я создаю класс kotlin, который расширяет RuntimeException и реализует GraphQLError, мне нужно переопределить метод getMessage() из GraphQLError, но когда я создаю класс java, который расширяет RuntimeException и реализует GraphQLError, мне не нужно переопределить метод getMessage() из GraphQLError.

Спасибо!

Я не в Kotlin, но, как я читал, это известная проблема в Kotlin, которая еще не решена: КТ-24822 (и другие)

Arnold Schrijver 05.07.2018 09:48

Да, я понимаю эту проблему, но мой вопрос касался другого факта: почему мне нужно переопределить метод getMessage () в Kotlin, но не в Java.

Dina Bogdan 05.07.2018 10:04
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
2
349
2

Ответы 2

Кажется, что переопределение метода доступа к свойству функцией еще явно не поддерживается. В настоящее время это ошибка по вашей ссылке. В этом легко убедиться на простом примере вроде этого:

class Sample(val message : String) {
    fun getMessage() :String = "MyString"
}

Это происходит потому, что свойство message (в вашем случае сообщение от Throwable) и функция getMessage (в вашем случае getMessage из GraphQL) преобразуются в одну и ту же подпись JVM. Мне кажется, что текущее статус-кво таково, что средства доступа к свойствам не рассматриваются как отдельные члены, поэтому их нельзя переопределить функциями-членами или даже реализовать абстрактные функции. Я не уверен, почему это так.

Аннотируйте сообщение с помощью @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()
}

Для лучшего понимания рекомендуется немного пояснить свой ответ.

Nitin Bisht 24.04.2020 12:54

Пожалуйста, добавьте пояснение к своему ответу.

Pbd 24.04.2020 13:21

Другие вопросы по теме