강의

멘토링

커뮤니티

Inflearn Community Q&A

mj199504257178's profile image
mj199504257178

asked

Toby's Spring Boot - Understanding and Principles

@Component Scan

코틀린 AnnotationConfigWebApplicationContext 관련 이슈

Resolved

Written on

·

790

2

 AnnotationConfigWebApplicationContext 익명함수가 잘 만들어지시나요?

저 같은 경우에 어떤 문제인지 모르겠는데 익명함수를 만들면 setClassLoader() 메소드를 오버라이딩하라는 컴파일 에러를 만나게 됩니다.

찾아본 결과 부모 클래스인 DefaultResourceLoader 에서 해당 메소드를 이미 구현하고 있는데 왜 다시 구현하라는지 모르겠습니다.

심지어 아래와 같이 overriding 해도 에러가 발생합니다.


fun main(args: Array<String>) {
    val applicationContext = object : AnnotationConfigWebApplicationContext() {
        @Override
        override fun onRefresh() {
            super.onRefresh()

            val tomcatWebServerFactory = TomcatServletWebServerFactory()
            val webServer =
                tomcatWebServerFactory.getWebServer({ servletContext ->
                    servletContext.addServlet("dispatcherServlet", object : DispatcherServlet(this) {
                    }).addMapping("/*")
                })
            webServer.start()
        }

        @Override
        override fun setClassLoader(classLoader: ClassLoader) {
            super.setClassLoader(classLoader)
        }
    }
    
    applicationContext.apply {
        refresh()
    }
}

이런 에러가 발생합니다.

    fun setClassLoader(classLoader: ClassLoader): Unit defined in tobyspring.helloboot.main.<no name provided>
    fun setClassLoader(classLoader: ClassLoader?): Unit defined in tobyspring.helloboot.main.<no name provided>

 

해결하신분이 계시다면 꼭 부탁 드리겠습니다..!

springkotlin코틀린spring-bootspring-jdbc

Answer 4

2

tobyilee님의 프로필 이미지
tobyilee
Instructor

이건 참 이상한 현상이네요.

제가 예제를 코틀린으로 만들어보지는 않았지만 위에 작업하신 부분만 해보니 말씀하신대로 이미 상위 클래스에서 구현된 메소드를 abstract라고 에러를 내는 현상이 보이네요. 그렇다고 구현을 정말 해버리면 Accidental override했다고 에러가 나고요.

흠. 저도 원인을 모르겠습니다. 같은 상위 클래스를 상속한 다른 Context의 경우엔 object로 만들어도 문제가 없는데 어떤 경우에만 생기네요.

일단 구현을 다시 했을 경우에 에러가 나는 문제는 찾아보니 강제로 에러가 나지 않게 하는 방법이 있긴합니다.

val context = object: AnnotationConfigWebApplicationContext() {
   @Suppress("ACCIDENTAL_OVERRIDE")
   override fun setClassLoader(classLoader: ClassLoader) {
      this.classLoader = classLoader
   }
}

애노테이션으로 Suppress하면 에러는 나지 않긴하네요.

근본적인 해결책은 아닌 듯하고, 시간이 날 때 관련 에러에 대해서 좀 더 확인을 해보겠습니다.

1

tobyilee님의 프로필 이미지
tobyilee
Instructor

코틀린이 자바와 호환성이 뛰어나고 자바 기술, 스프링 등을 매우 잘 지원한다고 알려져 있지만 100%는 아니더라고요. 꾸준히 이슈들이 제기되고 있긴합니다.

0

mj199504257178님의 프로필 이미지
mj199504257178
Questioner

아하 역시 호환성 이슈가 있었군요. 답변 감사합니다.

저도 이슈 제기된것들이 관련해서 있나 계속 확인해보겠습니다.

build.gradle 설정 보시고 수정하시면, 코드 변경 거의 없습니다.

0

mj199504257178님의 프로필 이미지
mj199504257178
Questioner

참고로 자바로 해봤을 때는 잘 돌아갑니다!

mj199504257178's profile image
mj199504257178

asked

Ask a question