java.lang.IllegalArgumentException:ServletContext需要配置默认的servlet处理

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (397)

我有以下测试课程:

@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,并且我得到了上面的异常...

提问于
用户回答回答于

你的一个@Configuration班级显然带有注释@EnableWebMvc。这就是DelegatingWebMvcConfiguration你的堆栈跟踪的结果,因为它是由导入@EnableWebMvc

因此,虽然你认为你不需要WebApplicationContext(因此也是ServletContext)a ,但事实上确实需要它,只是因为你正在加载应用程序上下文@EnableWebMvc

你有两个选择:

  • 为您的集成测试编写配置类,以便不包含与Web相关的配置(即@Configuration注释的类@EnableWebMvc)。
  • @WebAppConfiguration按照上面的其他注释中的建议注释您的测试课程。

用户回答回答于

好像你错过了

@WebAppConfiguration

来自你的测试班。

文件说明

资源库路径在幕后用于创建一个MockServletContext,它用作测试的WebApplicationContext的ServletContext。

通常一个Servlet容器会提供ServletContext。由于您处于测试环境中,因此您需要假冒。@WebAppConfiguration规定。

扫码关注云+社区