Класс инициализатора Spring не найден Tomcat при использовании Java 16
У меня очень простой Gradle (
7.0-rc-1
) скрипт для инициализации единственной конечной точки Spring 5 "hello world" с использованием встроенного экземпляра Tomcat. Исходный код взят из случайного примера, который я нашел в Интернете . Мой пример проекта Gradle можно найти здесь .
Я не уверен, как это работает, но каким-то образом веб-сервер знает, что нужно вызывать
WebApplicationInitializer.onStartup(ServletContext)
при запуске, чтобы Spring был инициализирован.
Это правильно работает на Java 8; но терпит неудачу, когда я изменяю следующую спецификацию инструментальной цепочки в определении сборки Gradle на Java 16.
java {
toolchain {
// languageVersion = JavaLanguageVersion.of(16)
languageVersion = JavaLanguageVersion.of(8)
}
}
При использовании Java 8 Spring инициализируется правильно, и конечная точка работает.
При использовании Java 16
onStartup()
не вызывается, поэтому Spring не инициализируется и конечная точка не работает (хотя Tomcat все еще запущен и отвечает с ошибкой).
В журнале отображается сообщение вроде, хотя трассировки стека нет:
INFO: No Spring WebApplicationInitializer types detected on classpath
Что мне нужно сделать, чтобы это работало на Java 16?
Обратите внимание, что я не хочу использовать пружинную загрузку, пожалуйста, не предлагайте ее.
1 ответ
Я нашел обходной путь, который настраивает Spring и отвечает на
/hello
конечная точка. Но я не знаю, почему это работает и правильно ли это.
Если кто-то может ответить на вопрос, объяснив, что происходит с Java 16, я с радостью отмечу это как принятый ответ.
Обходной путь
Моя работа - программно добавить
ServletContainerInitializer
класс.
Итак, где раньше я просто звонил
addWebapp()
метод:
tomcat.addWebapp("", appBase);
Теперь я добавляю свой инициализатор Spring явно:
Context appContext = tomcat.addWebapp("", appBase);
appContext.addServletContainerInitializer(new SpringAppConfig(), null);