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, когда я запускаю тест и получаю указанное выше исключение...
4 ответа
Один из ваших @Configuration
классы явно помечены @EnableWebMvc
, Вот как DelegatingWebMvcConfiguration
заканчивается в вашем следе стека, так как он импортируется @EnableWebMvc
,
Так что, хотя вы думаете, что вам не нужно WebApplicationContext
(и, следовательно, ServletContext
), на самом деле вам это нужно просто потому, что вы загружаете контекст приложения с @EnableWebMvc
,
У вас есть два варианта:
- Составьте классы конфигурации для вашего интеграционного теста, чтобы вы не включали веб-конфигурацию (т. Е.
@Configuration
класс (ы) с пометкой@EnableWebMvc
). - Аннотируйте свой тестовый класс с
@WebAppConfiguration
как предложено в других комментариях выше.
С Уважением,
Сэм (автор Spring TestContext Framework)
Кажется, ты пропал
@WebAppConfiguration
из вашего тестового класса.
Документация гласит
Путь к базе ресурсов используется за кулисами для создания MockServletContext, который служит в качестве ServletContext для WebApplicationContext теста.
Обычно контейнер сервлетов обеспечивает ServletContext
, Поскольку вы находитесь в среде тестирования, вам нужна фальшивка. @WebAppConfiguration
обеспечивает это.
Чтобы создать экземпляр контекста сервлета, вам придется использовать аннотацию.
@WebAppConfiguration
Аннотация на уровне класса, используемая для объявления, что ApplicationContext, загруженный для интеграционного теста, должен быть WebApplicationContext. Простое присутствие @WebAppConfiguration в классе теста гарантирует, что для теста будет загружен WebApplicationContext с использованием значения по умолчанию "file:src/main/webapp" для пути к корню веб-приложения (т. Е. Ресурса базовый путь). Путь к базе ресурсов используется за кулисами для создания MockServletContext, который служит в качестве ServletContext для WebApplicationContext теста.
Я получал похожую ошибку, но во время работы приложения нормально, а не пытался запустить тесты.
Оказывается, если вы используете обычай PermissionEvaluator
тогда вам нужно объявить это в отдельном @Configuration
Класс с тем, с вашей основной конфигурацией безопасности Spring в.
См. Как добавить защиту на основе методов в проект Spring Boot?
Существует также открытая проблема Github: https://github.com/spring-projects/spring-boot/issues/4875