Я новичок в Spring, и у меня уже есть очень странная проблема с базовой конфигурацией.
Вызвано: java.lang.IllegalStateException: Невозможно инициализировать контекст, поскольку уже присутствует корневой контекст приложения — проверьте, есть ли в вашем файле web.xml несколько определений ContextLoader*! в org.springframework.web.context.ContextLoader.initWebApplicationContext(ContextLoader.java:297) в org.springframework.web.context.ContextLoaderListener.contextInitialized(ContextLoaderListener.java:107) в io.undertow.servlet.core.ApplicationListeners.contextInitialized (ApplicationListeners.java:173) на io.undertow.servlet.core.DeploymentManagerImpl.deploy(DeploymentManagerImpl.java:194) ... еще 7
Мне нужны два разных сервлета REST: один для внутренних вызовов (просмотр на сервер) и один для внешнего API. Я также хочу, чтобы некоторые службы использовались обоими сервлетами, поэтому я использовал SpringRootConfiguration для сканирования пакетов, содержащих два перехватчика и одну службу.
Вся конфигурация выполняется на Java, только с контекстом и прослушивателем в файле web.xml.
web.xml
<context-param>
<param-name>contextClass</param-name>
<param-value>
org.springframework.web.context.support.AnnotationConfigWebApplicationContext
</param-value>
</context-param>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
Инициализатор SpringRestExternalApp
@Override
protected Class<?>[] getRootConfigClasses() {
return new Class[]{SpringRootConfiguration.class};
}
@Override
protected Class<?>[] getServletConfigClasses() {
return new Class[]{SpringRestExternalConfiguration.class};
}
@Override
protected String[] getServletMappings() {
return new String[]{"/api/*"};
}
@Override
protected String getServletName() {
return "restexternal";
}
Конфигурация SpringRoot
@ComponentScan({"be.xperthis.common"})
@Configuration
public class SpringRootConfiguration {
}
Внешняя конфигурация SpringRest
@ComponentScan("com.polymedis.result.web.api")
@Configuration
public class SpringRestExternalConfiguration extends WebMvcConfigurationSupport {
@Autowired
private NoCacheHandler noCacheHandler;
@Autowired
private RestMetricHandler restMetrics;
@Override
public void addInterceptors(final InterceptorRegistry registry) {
registry.addInterceptor(noCacheHandler);
registry.addInterceptor(restMetrics);
}
@Override
public void configureDefaultServletHandling(final DefaultServletHandlerConfigurer configurer) {
configurer.enable();
}
@Override
public void configureMessageConverters(final List<HttpMessageConverter<?>> converters) {
....
}
@Override
public RequestMappingHandlerMapping createRequestMappingHandlerMapping() {
return new ApiVersionRequestMappingHandlerMapping(); //used to check a custom annotation on every RestController methods
}
}
По идее, должна быть вторая конфигурация Rest (внутренняя), но я ее пока удалил, пытаясь понять исключение...
Примечание. Следуя руководству по безопасности Spring, у меня была такая же ошибка при помещении SpringSecurityConfiguration в getRootConfigClasses() { ... }
Должен ли я удалить/добавить что-то из web.xml? Я использую Wildfly 8, и мне уже пришлось искать обходной путь для ошибки в Wildfly: конфигурации Spring не подбираются, если библиотеки Spring (jars) не добавлены в папку WEB-Inf/lib...
SpringRestExternalAppInitializer
(который, вероятно, расширяетAbstractAnnotationConfigDispatcherServletInitializer
). На самом деле это почти то же самое: web.xml — это вариант xml, а расширениеAbstractAnnotationConfigDispatcherServletInitializer
— это способ сделать то же самое в Java. Поэтому вам нужно выбрать либо оставить web.xml, либо класс Java. Проверьте ответ на этот вопрос - это может помочь stackoverflow.com /вопросы/26676782/ - person lenach87   schedule 11.08.2016