Я недавно начал истекать с Kotlin и начал проект Spring Boot pet с использованием Kotlin.
Я пытаюсь интегрировать пользовательский объект домена пользователя в Spring Security и, следовательно, хочу реализовать интерфейс UserDetails .
С учетом объекта моего домена User ниже:
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 }
Я получаю следующие ошибки:
Случайное переопределение: следующие объявления имеют одну и ту же подпись JVM (getUsername () Ljava / lang / String;): public final fun <get-username> (): Kotlin.String, public abstract fun getUsername (): Kotlin.String!
Случайное переопределение: следующие объявления имеют одну и ту же подпись JVM (getPassword () Ljava / lang / String;): public final fun <get-password> (): Kotlin.String, public abstract fun getPassword (): Kotlin.String!
Поскольку у моего класса User уже есть метод getUsername (): Kotlin.String также реализует метод getUsername (): Kotlin.String! ?
Как я могу разрешить такую ошибку, кроме использования @JvmName в getter и setter свойства?
Проблема здесь в том, что свойство getter не может переопределить функцию из супертипа, с точки зрения Котлина. Чтобы обойти это, вы можете запретить компилятору генерировать геттеры, сделав ваши свойства private
и внедрить требуемые методы из супертипов вручную, например:
data class User( private val username: String = "" ... ): UserDetails { override fun getUsername() = username ... }