2015-10-06 7 views
10

Ho recentemente iniziato a lavorare in sinergia con Kotlin e ho avviato un progetto per animali da compagnia Spring Boot utilizzando Kotlin.Risoluzione degli errori di override accidentale in Kotlin

Sto cercando di integrare un oggetto dominio utente personalizzato su Spring Security e quindi di implementare l'intefaccia UserDetails.

Dato il mio oggetto di dominio Utente qui sotto:

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 
} 

ottengo i seguenti errori:

  1. esclusione accidentale: Le seguenti dichiarazioni hanno la stessa JVM firma (getUsername() Ljava/lang/String;): public final fun < get-username>(): Kotlin.String, public abstract fun getUsername(): Kotlin.String!

  2. esclusione accidentale: Le seguenti dichiarazioni hanno la stessa JVM firma (getPassword() Ljava/lang/String;): divertimento pubblico finale < get-password>(): Kotlin.String, pubblico divertimento astratta getPassword() : Kotlin.String!

Dal momento che la mia classe utente ha già un metodo getUsername(): Kotlin.String anche implementare il metodo getUsername(): Kotlin.String! ?

Come posso risolvere un simile errore, oltre all'utilizzo dello @JvmName sul getter e setter della proprietà?

risposta

22

Il problema qui è che è impossibile per un getter di proprietà ignorare una funzione da un supertipo, dal punto di vista di Kotlin. Per risolvere, è possibile evitare che il compilatore di generare getter, rendendo le vostre proprietà private e implementare metodi richiesti da supertipi manualmente, ad esempio:

data class User(
    private val username: String = "" 
    ... 
): UserDetails { 
    override fun getUsername() = username 
    ... 
} 
+0

ho incontrato problemi simili, https://stackoverflow.com/questions/45901531/how-to-create-a-data-class-implements-spring-secuirty-specific-userdetails, ma se ho aggiunto 'private', ho trovato l'operazione di distruzione distrutta. – Hantsy