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

时间:2014-02-02 21:48:25

标签: spring spring-mvc spring-test

我有以下测试类:

@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 个答案:

答案 0 :(得分:138)

您的@Configuration个类之一显然已使用@EnableWebMvc进行了注释。这就是DelegatingWebMvcConfiguration在您的堆栈跟踪中的结果,因为@EnableWebMvc导入

所以尽管你你不需要WebApplicationContext(因此也就是ServletContext),你实际上确实需要它只是因为你正在加载一个应用程序上下文与@EnableWebMvc

您有两种选择:

  • 编写集成测试的配置类,以便不包括与Web相关的配置(即@Configuration使用@EnableWebMvc注释的类。)
  • 根据上述其他评论中的建议,使用@WebAppConfiguration为您的测试类添加注释。

此致

Sam(Spring TestContext Framework的作者)

答案 1 :(得分:37)

好像你错过了

@WebAppConfiguration

来自你的考试班。

documentation

  

在幕后使用资源库路径来创建   MockServletContext,用作测试的ServletContext   的WebApplicationContext。

通常,Servlet容器将提供ServletContext。由于您处于测试环境中,因此您需要假货。 @WebAppConfiguration提供了这一点。

答案 2 :(得分:11)

为了实例化Servlet上下文,您必须使用注释。

@WebAppConfiguration

类级注释,用于声明为集成测试加载的ApplicationContext应该是WebApplicationContext。仅在测试类上存在@WebAppConfiguration可确保为测试加载WebApplicationContext,使用默认值“file:src / main / webapp”作为Web应用程序根目录的路径(即资源)基本路径)。在后台使用资源基本路径来创建MockServletContext,它充当测试的WebApplicationContext的ServletContext。

答案 3 :(得分:0)

我遇到了类似的错误,但是正常运行应用程序而不是尝试运行测试。

如果您正在使用自定义PermissionEvaluator,那么您需要在单独的@Configuration类中将其声明为具有主要Spring安全配置的类。

请参阅:How do I add method based security to a Spring Boot project?

还有一个开放的Github问题:https://github.com/spring-projects/spring-boot/issues/4875