2015-10-06 13 views
10

私は最近、コットリンで期限切れになり、Kotlinを使ってSpring Bootペットプロジェクトを開始しました。コトリンでの偶発的なオーバーライドエラーの解決

私はカスタムのユーザードメインオブジェクトをSpring Securityに統合しようとしているため、UserDetailsインターフェースを実装したいと考えています。

以下の私のドメイン・ユーザー・オブジェクトを考える:

  1. 偶然のオーバーライド:次の宣言が同じJVM 署名(getUsername()Ljava/langの持つ

    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 
    } 
    

    は、私は次のエラーを取得します/ String;):public final fun < get-username>():Kotlin.String、public abstract fun getUsername():Kotlin.String!

  2. 偶然のオーバーライド:次の宣言は、同じJVM 署名(getPasswordに()Ljava/LANG /文字列;)持っている:公共の最終楽しい<取得-パスワード>():Kotlin.String、パブリック抽象楽しいgetPasswordに() :Kotlin.String!

私のUserクラスはすでにメソッドgetUsernameを(持っているので):Kotlin.String:Kotlin.StringもメソッドgetUsername()を実装! ?

プロパティのgetterとsetterで@JvmNameを使用する以外に、このようなエラーをどのように解決する必要がありますか?

答えて

22

ここでの問題は、プロパティゲッタがKotlinの観点から、スーパータイプの関数をオーバーライドすることは不可能であるということです。これを回避するには、あなたがprivateあなたの特性を作ることによってゲッターを生成するから、コンパイラを防ぐことができ、例えば、手動でスーパータイプから必要なメソッドを実装します。

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

を私はhttps://stackoverflow.com/questions/45901531、同様の問題に遭遇しました/ how-to-create-a-data-class-implements-spring-secuirty-specific-userdetailsを追加しましたが、 'private'を追加すると、破壊操作が破棄されました。 – Hantsy

関連する問題