Ява.ленг.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(<generated>)
at org.springframework.web.servlet.config.annotation.DelegatingWebMvcConfiguration$$EnhancerByCGLIB$$bb4ceb44$$FastClassByCGLIB$8bb5c1.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заканчивается в трассировке стека, так как это импортные by@EnableWebMvc.так хоть ты думаю вам не нужен
WebApplicationContext(и, следовательно, aServletContext), вам на самом деле это нужно просто потому, что вы загружаете контекст приложения с@EnableWebMvc.у вас есть два варианта:
- составьте классы конфигурации для вашего интеграционный тест, чтобы вы не включали веб-конфигурацию (т. е.
@Configurationкласс (ы) с аннотацией@EnableWebMvc).- аннотировать тестовый класс с
@WebAppConfigurationкак было предложено в других комментариях выше.С уважением,
Сэм (автор Spring Testcontext Framework)
кажется, что вы пропали без вести
@WebAppConfigurationиз вашего тестового класса.
The документация государства
путь к базе ресурсов используется за кулисами для создания MockServletContext, который служит в качестве ServletContext для теста WebApplicationContext.
обычно контейнер сервлета предоставляет
ServletContext. Поскольку вы находитесь в тестовой среде, вам нужна подделка.@WebAppConfigurationобеспечивает что.
чтобы создать экземпляр контекста сервлета, вам нужно будет использовать аннотацию.
@WebAppConfigurationаннотация уровня класса, которая используется для объявления того, что ApplicationContext, загруженный для теста интеграции, должен быть WebApplicationContext. Простое наличие @WebAppConfiguration в тестовом классе гарантирует, что WebApplicationContext будет загружен для теста, используя значение по умолчанию "file:src / main / webapp" для пути к корню веб-приложения (т. е. путь к ресурсной базе). Путь к базе ресурсов используется за кулисами для создания MockServletContext, который служит ServletContext для WebApplicationContext теста.
Я получал аналогичную ошибку, но во время работы приложения обычно, а не пытаться запустить тесты.
оказывается, если вы используете пользовательский
PermissionEvaluatorтогда вам нужно объявить его в отдельном@Configurationкласс к тому, в котором находится ваша основная конфигурация безопасности Spring.посмотреть: как я могу добавить метод обеспечения безопасности, основанный на Весна загрузки проекта?
существует также открытая проблема Github: https://github.com/spring-projects/spring-boot/issues/4875
Comments