23

I've recently started expirementing with Kotlin and started a Spring Boot pet project using Kotlin.

I'm trying to integrate a custom User domain object to Spring Security and thus want to implement the UserDetails inteface.

Given my domain User object below:

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
}

I get the following errors:

  1. Accidental override: The following declarations have the same JVM signature (getUsername()Ljava/lang/String;): public final fun < get-username>(): Kotlin.String, public abstract fun getUsername(): Kotlin.String!

  2. Accidental override: The following declarations have the same JVM signature (getPassword()Ljava/lang/String;): public final fun < get-password>(): Kotlin.String, public abstract fun getPassword(): Kotlin.String!

Since my User class already has a method getUsername(): Kotlin.String also implement the method getUsername(): Kotlin.String! ?

How am I supposed to resolve such an error, other than using the @JvmName on the property's getter and setter?

2

1 Answer 1

39

The problem here is that it's impossible for a property getter to override a function from a supertype, from Kotlin's point of view. To workaround it, you can prevent the compiler from generating getters by making your properties private and implement required methods from supertypes manually, for example:

data class User(
    private val username: String = ""
    ...
): UserDetails {
    override fun getUsername() = username
    ...
}
Sign up to request clarification or add additional context in comments.

1 Comment

I encountered similar problems, stackoverflow.com/questions/45901531/…, but if I added private, I found it destroyed destruction operation.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.