2015-10-06 32 views
10

में दुर्घटनाग्रस्त ओवरराइड त्रुटियों को हल करना मैंने हाल ही में कोटलिन के साथ समाप्त होने शुरू कर दिया है और कोटलिन का उपयोग करके स्प्रिंग बूट पालतू परियोजना शुरू की है।कोटलिन

मैं एक कस्टम उपयोगकर्ता डोमेन ऑब्जेक्ट को स्प्रिंग सिक्योरिटी में एकीकृत करने की कोशिश कर रहा हूं और इस प्रकार UserDetails इंटीफेस को कार्यान्वित करना चाहता हूं।

मेरे डोमेन उपयोगकर्ता नीचे वस्तु को देखते हुए:

  1. दुर्घटना ओवरराइड: निम्नलिखित घोषणाओं एक ही JVM हस्ताक्षर (getUsername() Ljava/लैंग है

    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 
    } 
    

    मैं निम्नलिखित त्रुटियाँ प्राप्त/स्ट्रिंग;): सार्वजनिक अंतिम मजेदार < मिल-उपयोगकर्ता नाम>(): Kotlin.String, सार्वजनिक अमूर्त मज़ा प्राप्त उपयोगकर्ता नाम(): Kotlin.String!

  2. दुर्घटना ओवरराइड: निम्नलिखित घोषणाओं एक ही JVM हस्ताक्षर (getPassword() Ljava/लैंग/स्ट्रिंग;) है: सार्वजनिक अंतिम मज़ा < मिल-पासवर्ड>(): Kotlin.String, सार्वजनिक सार मज़ा getPassword() : Kotlin.String!

मेरे उपयोगकर्ता वर्ग के बाद से पहले से ही एक विधि getUsername है(): Kotlin.String: Kotlin.String भी विधि getUsername() को लागू! ?

संपत्ति के गेटर और सेटर पर @JvmName का उपयोग करने के अलावा, मुझे ऐसी त्रुटि को कैसे हल किया जाना चाहिए?

उत्तर

22

समस्या यह है कि एक संपत्ति प्राप्तकर्ता को कोटलिन के दृष्टिकोण से, सुपरटेप से किसी फ़ंक्शन को ओवरराइड करना असंभव है। यह वैकल्पिक हल के लिए आप संकलक ही टिककर खेल पैदा करने से अपने गुण private बनाकर मैन्युअल उदाहरण के लिए रोका जा सकता है और लागू supertypes से आवश्यक तरीकों,:

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

मैं इसी तरह की समस्याओं का सामना करना पड़ा, https://stackoverflow.com/questions/45901531/कैसे-टू-बिल्ड-ए-डेटा-क्लास-उपकरण-वसंत-सेक्यूरि-विशिष्ट-उपयोगकर्ता विवरण, लेकिन अगर मैंने 'निजी' जोड़ा, तो मैंने पाया कि यह विनाश ऑपरेशन को नष्ट कर दिया गया है। – Hantsy