У меня есть приложение Spring MVC , использующее либо версию 4.3.11 , либо 4.3.23 , где Jboss 6.4
работает правильно, но при миграции до Jboss 7.2
мы получаем
java.lang.IllegalStateException: UT010041: Контекст сервлета уже был инициализирован, этот метод можно вызывать только из ServletContainerInitializer или ServletContextListener во время развертывания.
Похоже, это связано с переходом с Jboss на Undertow, но я не мог понять, что мне нужно сделать, чтобы обойти его и заставить приложение работать.
Сначала я обнаружил, что это связано с использованием Spring 4.3.11 и обновлением до Spring 4.3.23 , а также обновлением до JavaEE spec для 8 Но в обеих версиях проблема сохраняется.
11: 27: 09,088 ОШИБКА [org.jboss.msc.service.fail] (Пул потоков ServerService - 93) MSC000001: Не удалось запустить службу jboss.deployment.unit. "SampleDojo-app-1.0.0-SNAPSHOT .war ".undertow-deploy: org.jboss.msc.service.StartException в службе jboss.deployment.unit." sampleDojo-app-1.0.0-SNAPSHOT.war ".undertow-deploy: java.lang.IllegalStateException: UT010041 : Контекст сервлета уже инициализирован, этот метод можно вызывать только из ServletContainerInitializer или ServletContextListener
at org.wildfly.extension.undertow.deployment.UndertowDeploymentService $ 1.run (UndertowDeploymentService.java:81)
в java.util.concurrent.Executors $ RunnableAdapter.call (Executors.java:511)
в java.util.concurrent.FutureTask.run (FutureTask.java:266)
в org.jboss.threads.ContextClassLoaderSavingRunnable.run (ContextClassLoaderSavingRunnable.java:35)
в org.jboss.threads.EnhancedQueueExecutor.safeRun (EnhancedQueueExecutor.java:1985)
в org.jboss.threads.EnhancedQueueExecutor $ ThreadBody.doRunTask (EnhancedQueueExecutor.java:1487)
в org.jboss.threads.EnhancedQueueExecutor $ ThreadBody.run (EnhancedQueueExecutor.java:1378)
на java.lang.Thread.run (Thread.java:748)
в org.jboss.threads.JBossThread.run (JBossThread.java:485)
Причина: java.lang.IllegalStateException: UT010041: контекст сервлета уже инициализирован, этот метод можно вызывать только из ServletContainerInitializer или ServletContextListener
в io.undertow.servlet.spec.ServletContextImpl.ensureNotInitialized (ServletContextImpl.java:955)
в io.undertow.servlet.spec.ServletContextImpl.addFilter (ServletContextImpl.java:630)
на br.com.itau.internet.core.impl.web.BaseAnnotationConfigServlet.addServletFilter (BaseAnnotationConfigServlet.java:67)
на br.com.itau.internet.core.impl.web.BaseAnnotationConfigServlet.addServletFilters (BaseAnnotationConfigServlet.java:46)
на br.com.itau.internet.core.impl.web.BaseAnnotationConfigServlet.initWebApplicationContext (BaseAnnotationConfigServlet.java:29)
в org.springframework.web.servlet.FrameworkServlet.initServletBean (FrameworkServlet.java:494)
в org.springframework.web.servlet.HttpServletBean.init (HttpServletBean.java:171)
в javax.servlet.GenericServlet.init (GenericServlet.java:244)
в io.undertow.servlet.core.LifecyleInterceptorInvocation.proceed (LifecyleInterceptorInvocation.java:117)
в org.wildfly.extension.undertow.security.RunAsLifecycleInterceptor.init (RunAsLifecycleInterceptor.java:78)
в io.undertow.servlet.core.LifecyleInterceptorInvocation.proceed (LifecyleInterceptorInvocation.java:103)
в io.undertow.servlet.core.ManagedServlet $ DefaultInstanceStrategy.start (ManagedServlet.java:303)
в io.undertow.servlet.core.ManagedServlet.createServlet (ManagedServlet.java:143)
в io.undertow.servlet.core.DeploymentManagerImpl $ 2.call (DeploymentManagerImpl.java:583)
в io.undertow.servlet.core.DeploymentManagerImpl $ 2.call (DeploymentManagerImpl.java:554)по адресу io.undertow.servlet.core.ServletRequestContextThreadSetupAction $ 1.call (ServletRequestContextThreadSetupAction.java:42) по адресу io.undertow.servlet.core.ContextClassLoaderSetupAction $ 1.call.exup.windows.sectoj.dll.SecurityContextThreadSetupAction.lambda $ create $ 0 (SecurityContextThreadSetupAction.java:105) в org.wildfly.extension.undertow.deployment.UndertowDeploymentInfoService $ UndertowThreadSetupAction.lambda.wpg для юниверсов..UndertowDeploymentInfoService $ UndertowThreadSetupAction.lambda $ create $ 0 (UndertowDeploymentInfoService.java:1502) по адресу org.wildfly.extension.undertow.deployment.UndertowDeploymentInfoService $ Undertow.world.tw..deployment.UndertowDeploymentInfoService $ UndertowThreadSetupAction.lambda $ create $ 0 (UndertowDeploymentInfoService.java:1502) в io.undertow.servlet.core.DeploymentManagerImpl.start (DeploymentManagerImpl.java:596) по адресу org.wildfly.extension.undertow.deployment.UndertowDeploymentService.startContext (UndertowDeploymentService.java:97 )wwd.wder.run (UndertowDeploymentService.java:78) ... еще 8
К сожалению, у меня нет возможности на момент перехода на Spring 5, мне нужны эти приложения для работы в Spring 4.x.
Я посмотрел повсюду, но до сих пор не могу понять, что может быть не так.
Отладка приложения, я обнаружил, что ошибка происходит, когда я пытаюсь добавить фильтр
final ServletRegistration.Dynamic sr = getServletContext().addServlet(servlet.getServletName(), servlet.getServletClass());
sr.addMapping(servlet.getServletPath());
sr.setLoadOnStartup(1);