Java.lang.IllegalArgumentException: ServletContext требуется для настройки обработки сервлета по умолчанию
У меня есть следующий тестовый класс:
@ActiveProfiles({ "DataTC", "test" })
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = {BaseTestConfiguration.class, DataTestConfiguration.class, JpaConfiguration.class, PropertyPlaceholderConfiguration.class })
public class RegularDayToTimeSlotsTest {
...
Проблема, похоже, исходит из класса 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 {
}
Я систематически получаю это исключение:
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.<init>(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(<generated>)
at org.springframework.web.servlet.config.annotation.DelegatingWebMvcConfiguration$$EnhancerByCGLIB$$bb4ceb44$$FastClassByCGLIB$$368bb5c1.invoke(<generated>)
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(<generated>)
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, когда я запускаю тест, и получаю исключение выше...
Ответы
Ответ 1
Один из ваших классов @Configuration
, очевидно, аннотируется с помощью @EnableWebMvc
. То, как DelegatingWebMvcConfiguration
заканчивается в вашей трассировке стека, поскольку оно импортируется с помощью @EnableWebMvc
.
Итак, хотя вы считаете, что вам не нужен WebApplicationContext
(и, следовательно, ServletContext
), вам действительно нужно это просто потому, что вы загружаете контекст приложения с помощью @EnableWebMvc
.
У вас есть два варианта:
- Составьте классы конфигурации для вашего теста интеграции, чтобы вы не включали связанную с Интернетом конфигурацию (т.е. класс
@Configuration
, аннотированный с помощью @EnableWebMvc
).
- Аннотировать свой тестовый класс
@WebAppConfiguration
, как это было предложено в других комментариях выше.
Привет,
Сэм (автор Spring TestContext Framework)
Ответ 2
Кажется, что вам не хватает
@WebAppConfiguration
из вашего тестового класса.
documentation утверждает
Путь базы данных используется за кулисами для создания MockServletContext, который служит в качестве ServletContext для тестов WebApplicationContext.
Обычно контейнер Servlet предоставляет ServletContext
. Поскольку вы находитесь в тестовой среде, вам нужна подделка. @WebAppConfiguration
обеспечивает это.
Ответ 3
Чтобы создать экземпляр контекста сервлета, вам нужно будет использовать аннотацию.
@WebAppConfiguration
Аннотации на уровне класса, которые используются для объявления того, что ApplicationContext, загруженный для теста интеграции, должен быть WebApplicationContext. Простое присутствие @WebAppConfiguration в тестовом классе гарантирует загрузку WebApplicationContext для теста с использованием значения по умолчанию "file: src/main/webapp" для пути к корню веб-приложения (т.е. Ресурса базовый путь). Базовый путь ресурса используется за кулисами для создания MockServletContext, который служит в качестве ServletContext для тестов WebApplicationContext.
Ответ 4
Я получал аналогичную ошибку, но при запуске приложения обычно вместо попыток запуска тестов.
Оказывается, если вы используете пользовательский PermissionEvaluator
, тогда вам нужно объявить его в отдельном классе @Configuration
тому, у кого есть главная конфигурация безопасности Spring.
Смотрите: Как добавить безопасность на основе метода в проект загрузки Spring?
Существует также открытая проблема Github: https://github.com/spring-projects/spring-boot/issues/4875