티스토리 뷰

 

1. 오류 원인

Kotlin은 컴파일 시에 자바 바이트코드(.class)로 변환되기 때문에 다른 자바 파일과 호환이 되고 JVM에 의해 실행된다. 오류 메시지를 보면 JVM 시그니처가 충돌했음을 알 수 있다.

 

아래 코드를 보면 4개의 프로퍼티(email, password, nickName, authorities)가 존재한다. 코틀린 컴파일러는 프로퍼티에 대해서 자동으로 getter와 setter를 생성한다. 따라서 password와 authroties 프로퍼티에 대해서도 자동으로 getter가 생성된다. 여기서 한 가지 문제점이 발생하는데 현재 코드에는 UserDetails을 상속하면서 getPassword(), getAuthorities()를 오버라이딩하고 있다. 코틀린 컴파일러에 의해 자바 바이트 코드로 변환될 때, 코틀린 컴파일러에 의해 자동으로 생성된 password, authorities의 getter와 오버라이딩 중인 getPassword(), getAuthorities() 메서드가 충돌하는 것이다.

import org.springframework.security.core.GrantedAuthority
import org.springframework.security.core.userdetails.UserDetails

class CustomUserDetails(
    val email: String,
    val password: String,
    val nickName: String,
    val authorities: MutableCollection<GrantedAuthority>
) : UserDetails {

    override fun getAuthorities(): MutableCollection<out GrantedAuthority> {
        return authorities
    }

    override fun getPassword(): String {
        return password
    }

    override fun getUsername(): String {
        return email
    }

    override fun isAccountNonExpired(): Boolean {
        return true
    }

    override fun isAccountNonLocked(): Boolean {
        return true
    }

    override fun isCredentialsNonExpired(): Boolean {
        return true
    }

    override fun isEnabled(): Boolean {
        return true
    }
}

 

 

2. 원인 해결

JVM 시그너치 충돌이 발생한 근본적인 원인인 프로퍼티 명을 변경하면 된다. 즉, password와 authorities 프로퍼티 명을 다른 것으로 바꾼다.

import org.springframework.security.core.GrantedAuthority
import org.springframework.security.core.userdetails.UserDetails

class CustomUserDetails(
    val email: String,
    val pwd: String,
    val nickName: String,
    val roles: MutableCollection<GrantedAuthority>
) : UserDetails {

    override fun getAuthorities(): MutableCollection<out GrantedAuthority> {
        return roles
    }

    override fun getPassword(): String {
        return pwd
    }

    override fun getUsername(): String {
        return email
    }

    override fun isAccountNonExpired(): Boolean {
        return true
    }

    override fun isAccountNonLocked(): Boolean {
        return true
    }

    override fun isCredentialsNonExpired(): Boolean {
        return true
    }

    override fun isEnabled(): Boolean {
        return true
    }
}
Total
Today
Yesterday
최근에 올라온 글
«   2024/11   »
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30