#java #spring-boot #tomcat #servlets #undertow
#java #spring-boot #tomcat #сервлеты #undertow
Вопрос:
Я пытаюсь настроить простой пример проекта spring-boot (учебное пособие по keycloak), но я застрял при ошибке запуска. Единственное, что отличается от исходной конфигурации, это то, что я хочу использовать undertow server вместо tomcat.
Запуск основного класса без каких-либо изменений завершен успешно (основной класс с аннотацией @SpringBootApplication) (mvn spring-boot: запуск после очистки и установки) (стандартная настройка tomcat).
После следующих изменений в pom я получаю сообщение об ошибке:
java.lang.Исключение IllegalStateException: нет набора ServletContext
Подробности см. Ниже:
Изменения POM:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<exclusions>
<exclusion>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-tomcat</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-undertow</artifactId>
</dependency>
вместо
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
Ошибка запуска Spring boot при использовании undertow:
12:48:55.077 [основная] ОШИБКА при загрузке.SpringApplication — сбой запуска приложения org.springframework.beans.factory.Исключение BeanCreationException: ошибка при создании компонента с именем ‘resourceHandlerMapping’, определенным в ресурсе пути к классу [org/springframework/boot/autoconfigure/web/servlet/WebMvcAutoConfiguration$EnableWebMvcConfiguration.class] : Не удалось создать экземпляр компонента с помощью заводского метода; вложенным исключением является org.springframework.beans.Исключение BeanInstantiationException: не удалось создать экземпляр [org.springframework.web.servlet .HandlerMapping]: Фабричный метод ‘resourceHandlerMapping’ вызвал исключение; вложенным исключением является java.lang.Исключение IllegalStateException: нет ServletContext, установленного в org.springframework.beans.factory.support.ConstructorResolver.instantiate(ConstructorResolver.java:655 ) в org.springframework.beans.factory.support.ConstructorResolver.instantiateUsingFactoryMethod(ConstructorResolver.java:635 ) в org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.instantiateUsingFactoryMethod(AbstractAutowireCapableBeanFactory.java:1336 ) в org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:1176) в org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:556) в org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:516) в org.springframework.beans.factory.support.AbstractBeanFactory.lambda $ doGetBean $ 0(AbstractBeanFactory.java:324) в org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:226) в org.springframework.beans.factory.support.AbstractBeanFactory .doGetBean(AbstractBeanFactory.java:322) в org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:202) в org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:897) в org.springframework.context.support.AbstractApplicationContext.finishbeanfactoryинициализация (AbstractApplicationContext.java:879) в org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:551) в org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.refresh(ServletWebServerApplicationContext.java:143) в org.springframework.boot.SpringApplication.refresh(SpringApplication.java:758) в org.springframework.boot.SpringApplication.refresh(SpringApplication.java:750) в org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:397) в org.springframework.boot.SpringApplication.run(SpringApplication.java:315) в org.springframework.boot.SpringApplication.run(SpringApplication.java:1237) в org.springframework.boot.SpringApplication.run(SpringApplication.java:1226) в com.baeldung.keycloak.SpringBoot.main(SpringBoot.java:11), вызванному: org.springframework.beans.Исключение BeanInstantiationException: не удалось создать экземпляр [org.springframework.web.servlet .HandlerMapping]: Фабричный метод ‘resourceHandlerMapping’ вызвал исключение; вложенным исключением является java.lang.Исключение IllegalStateException: нет ServletContext, установленного в org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:185 ) в org.springframework.beans.factory.support.ConstructorResolver.instantiate(ConstructorResolver.java:650 ) … пропущено 20 общих фреймов, вызванных: java.lang.Исключение IllegalStateException: в org.springframework.util не установлен ServletContext.Assert.state(Assert.java:76) в org.springframework.web.servlet.config.annotation.WebMvcConfigurationSupport.resourceHandlerMapping(WebMvcConfigurationSupport.java:534) в java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(собственный метод) в java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke( NativeMethodAccessorImpl.java:62) в java.base/jdk.internal.reflect.Делегирование methodaccessorimpl.invoke(делегирование methodaccessorimpl.java:43) в java.base/java.lang.reflect.Метод.invoke(метод.java: 566) в org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:154 ) … 21 общий кадр опущен
Используемая версия Spring-boot. является 2.3.3.RELEASE (как указано в родительском pom).
Как я могу заставить это работать с сервером undertow?
Комментарии:
1. Можете ли вы создать экземпляр UndertowEmbeddedServletContainerFactory в вашей конфигурации java. Обратитесь к baeldung.com/spring-boot-application-configuration
2. Это не работает (добавление компонента). Это также похоже на устаревший синтаксис, я пробовал использовать UndertowServletWebServerFactory вместо UndertowEmbeddedServletContainerFactory (не компилируется). К сожалению, появляются те же ошибки.
Ответ №1:
исправлено
Когда часть, показанная ниже, отделена от исходного класса SecurityConfig, она работает с undertow:
(новый класс)
@Configuration
public class KeycloakConfig {
@Bean
public KeycloakSpringBootConfigResolver KeycloakConfigResolver() {
return new KeycloakSpringBootConfigResolver();
}
}