java.lang.IllegalArgumentException: ServletContext требуется для настройки обработки сервлета по умолчанию
У меня есть следующий тестовый class:
@ActiveProfiles({ "DataTC", "test" }) @RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration(classes = {BaseTestConfiguration.class, DataTestConfiguration.class, JpaConfiguration.class, PropertyPlaceholderConfiguration.class }) public class RegularDayToTimeSlotsTest { ...
Проблема, похоже, исходит из classа BaseTestConfiguration:
@Configuration @ComponentScan(basePackages = { "com.bignibou" }, excludeFilters = { @Filter(type = FilterType.CUSTOM, value = RooRegexFilter.class), @Filter(type = FilterType.ANNOTATION, value = Controller.class), @Filter(type = FilterType.ANNOTATION, value = ControllerAdvice.class) }) public class BaseTestConfiguration { }
Я систематически получаю это исключение:
- Spring + Web MVC: dispatcher-servlet.xml и applicationContext.xml (плюс общая безопасность)
- Как получить объект сеанса весной?
- получение исключения: не определен bean с именем «springSecurityFilterChain»
- Загрузка файлов с помощью API-интерфейса Angular2 в REST
- Исправления для проверки подлинности безопасности пружины с помощью @ExceptionHandler
Caused by: java.lang.IllegalArgumentException: A ServletContext is required to configure default servlet handling at org.springframework.util.Assert.notNull(Assert.java:112) at org.springframework.web.servlet.config.annotation.DefaultServletHandlerConfigurer.(DefaultServletHandlerConfigurer.java:54) at org.springframework.web.servlet.config.annotation.WebMvcConfigurationSupport.defaultServletHandlerMapping(WebMvcConfigurationSupport.java:329) at org.springframework.web.servlet.config.annotation.DelegatingWebMvcConfiguration$$EnhancerByCGLIB$$bb4ceb44.CGLIB$defaultServletHandlerMapping$22() at org.springframework.web.servlet.config.annotation.DelegatingWebMvcConfiguration$$EnhancerByCGLIB$$bb4ceb44$$FastClassByCGLIB$$368bb5c1.invoke() at org.springframework.cglib.proxy.MethodProxy.invokeSuper(MethodProxy.java:228) at org.springframework.context.annotation.ConfigurationClassEnhancer$BeanMethodInterceptor.intercept(ConfigurationClassEnhancer.java:326) at org.springframework.web.servlet.config.annotation.DelegatingWebMvcConfiguration$$EnhancerByCGLIB$$bb4ceb44.defaultServletHandlerMapping() at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:606) at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:166) ... 43 more
Я не уверен, как обойти эту проблему. Почему-то Spring ищет ServletContext, когда я запускаю тест, и получаю исключение выше …
Один из ваших classов @Configuration
очевидно, аннотируется с помощью @EnableWebMvc
. Вот как DelegatingWebMvcConfiguration
попадает в вашу трассировку стека, поскольку она импортируется @EnableWebMvc
.
Поэтому, хотя вы считаете, что вам не нужен WebApplicationContext
(и, следовательно, ServletContext
), на самом деле вам это нужно просто потому, что вы загружаете контекст приложения с помощью @EnableWebMvc
.
У вас есть два варианта:
- Составьте classы конфигурации для вашего теста интеграции, чтобы вы не включали связанную с сетью конфигурацию (то
@Configuration
class@Configuration
аннотированный с помощью@EnableWebMvc
). - Аннотировать свой тестовый class с помощью
@WebAppConfiguration
как это предлагается в других комментариях выше.
С Уважением,
Сэм (автор Spring TestContext Framework)
Кажется, что вам не хватает
@WebAppConfiguration
из вашего тестового classа.
В документации указано
Базовый путь ресурса используется за кулисами для создания MockServletContext, который служит в качестве ServletContext для WebApplicationContext теста.
Обычно контейнер Servlet предоставляет ServletContext
. Поскольку вы находитесь в тестовой среде, вам нужна подделка. @WebAppConfiguration
обеспечивает это.
Чтобы создать экземпляр контекста сервлета, вам нужно будет использовать аннотацию.
@WebAppConfiguration
Аннотирование на уровне classа, используемое для объявления того, что ApplicationContext, загруженный для теста интеграции, должен быть WebApplicationContext. Простое присутствие @WebAppConfiguration в тестовом classе гарантирует загрузку WebApplicationContext для теста с использованием значения по умолчанию «file: src / main / webapp» для пути к корню веб-приложения (т. Е. Ресурса базовый путь). Базовый путь ресурса используется за кулисами для создания MockServletContext, который служит в качестве ServletContext для WebApplicationContext теста.
Я получал аналогичную ошибку, но при запуске приложения обычно вместо попыток запуска тестов.
Оказывается, если вы используете пользовательский PermissionEvaluator
тогда вам нужно объявить его в отдельном classе @Configuration
который находится в вашей основной конфигурации безопасности Spring.
См.: Как добавить защиту на основе метода к проекту Spring Boot?
Существует также открытая проблема Github: https://github.com/spring-projects/spring-boot/issues/4875