인프런 커뮤니티 질문&답변

이민준님의 프로필 이미지
이민준

작성한 질문수

토비의 스프링 부트 - 이해와 원리

@Component 스캔

코틀린 AnnotationConfigWebApplicationContext 관련 이슈

해결된 질문

작성

·

665

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>

 

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

답변 4

2

토비님의 프로필 이미지
토비
지식공유자

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

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

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

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

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

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

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

1

토비님의 프로필 이미지
토비
지식공유자

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

0

이민준님의 프로필 이미지
이민준
질문자

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

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

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

0

이민준님의 프로필 이미지
이민준
질문자

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

이민준님의 프로필 이미지
이민준

작성한 질문수

질문하기