Устранение ошибок случайного переопределения в Kotlin

Я недавно начал использовать Kotlin с истекшим сроком и начал проект Pet Boot Spring с использованием Kotlin.

Я пытаюсь интегрировать пользовательский объект домена пользователя в Spring Security и, таким образом, хочу реализовать интерфейс UserDetails.

Учитывая мой пользовательский объект домена ниже:

import org.springframework.data.annotation.Id as DocumentId
import org.springframework.data.mongodb.core.mapping.Document
import org.springframework.security.core.GrantedAuthority
import org.springframework.security.core.authority.AuthorityUtils
import org.springframework.security.core.userdetails.UserDetails

@Document
data class User(@DocumentId val id: String? = null,
                val username: String = "",
                val password: String = "",
                val email: String = "",
                val name: String? = null,
                val surname: String? = null) : UserDetails {

    override fun isCredentialsNonExpired(): Boolean = true

    override fun isAccountNonExpired(): Boolean = true

    override fun isAccountNonLocked(): Boolean = true

    override fun getAuthorities(): MutableCollection<out GrantedAuthority> = AuthorityUtils.createAuthorityList("USER")

    override fun isEnabled(): Boolean = true
}

Я получаю следующие ошибки:

  1. Случайное переопределение: следующие объявления имеют одинаковую подпись JVM (getUsername()Ljava/lang/String;): public final fun (): Kotlin.String, public abstract fun getUsername(): Kotlin.String!

  2. Случайное переопределение: Следующие объявления имеют одинаковую подпись JVM (getPassword()Ljava/lang/String;): public final fun (): Kotlin.String, public abstract fun getPassword(): Kotlin.String!

Так как мой класс User уже имеет метод getUsername (): Kotlin.String также реализует метод getUsername(): Kotlin.String!?

Как я должен устранить такую ​​ошибку, кроме использования @JvmName в методах получения и установки свойства?

1 ответ

Решение

Проблема здесь в том, что для получателя свойства невозможно переопределить функцию из супертипа, с точки зрения Котлина. Чтобы обойти это, вы можете запретить компилятору генерировать геттеры, сделав ваши свойства private и вручную реализовать необходимые методы из супертипов, например:

data class User(
    private val username: String = ""
    ...
): UserDetails {
    override fun getUsername() = username
    ...
}
Другие вопросы по тегам