해결된 질문
작성
·
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
0
0
build.gradle 설정 보시고 수정하시면, 코드 변경 거의 없습니다.