Ява.ленг.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, когда я запускаю тест, и я получаю вышеуказанное исключение...

698   4  

4 ответов:

ваш @Configuration классы, очевидно, аннотируется с @EnableWebMvc. Вот как DelegatingWebMvcConfiguration заканчивается в трассировке стека, так как это импортные by @EnableWebMvc.

так хоть ты думаю вам не нужен WebApplicationContext (и, следовательно, a ServletContext), вам на самом деле это нужно просто потому, что вы загружаете контекст приложения с @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

    Ничего не найдено.