Замена tomcat на undertow server для проекта spring-boot-keycloak приводит к исключению IllegalStateException: нет набора ServletContext

#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();
  }
}