Spring с Kotlin - последний метод в открытом классе не может получить доступ к переменным-членам - PullRequest
0 голосов
/ 14 мая 2019

У меня есть класс сказать -

@Component
open class Foo @Autowired constructor(bar: Bar) {

    private val myList = listOf(1,2,3)

    open fun readFirst() {
        println(myList[0])
    }

    fun readAll() {
        myList.forEach { i -> println(i) }
    }
}

Метод readFirst работает нормально и может получить доступ к myList, но метод readAll выдает исключение нулевого указателя для myList.

Если я делаю readAll открытым или я делаю класс и readFirst финальным, удаляя ключевое слово open, то это также работает нормально.

Есть ли причина для этого или это ошибка.

ПРИМЕЧАНИЕ. Это не тот код, который не удался, но это пример того, что происходило.

1 Ответ

0 голосов
/ 15 мая 2019

Вероятно, это связано с тем, что среда Spring работает на магию, создавая скрытые подклассы и переопределяя методы.

В отличие от Java, Kotlin по умолчанию не открыт (то, что Java вызывает final) для классов и методов,и нуждается в ключевом слове open, чтобы сделать их открытыми.Это обычно Good Thing ™, но, как вы обнаружили, это нарушает Spring.

Один из способов решения этой проблемы - пометить все такие классы и методы как open.

Но это прощеиспользуйте плагин компилятора .Это автоматически делает открытыми все классы, которые используют определенные аннотации Spring.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...