wake-up-neo.com

java.lang.IllegalArgumentException: Zur Konfiguration der Standard-Servlet-Verarbeitung ist ein ServletContext erforderlich

Ich habe die folgende Testklasse:

@ActiveProfiles({ "DataTC", "test" })
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = {BaseTestConfiguration.class, DataTestConfiguration.class, JpaConfiguration.class, PropertyPlaceholderConfiguration.class })
public class RegularDayToTimeSlotsTest {
...

Das Problem scheint von der BaseTestConfiguration-Klasse zu stammen:

@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 {

}

Ich bekomme systematisch diese Ausnahme:

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

Ich bin nicht sicher, wie ich dieses Problem umgehen kann. Irgendwie sucht Spring nach einem ServletContext, wenn ich den Test durchführe und ich die obige Ausnahme bekomme ...

55
balteo

Eine Ihrer @Configuration-Klassen ist offensichtlich mit @EnableWebMvc versehen. So landet DelegatingWebMvcConfiguration in Ihrem Stack-Trace, da es importiert von @EnableWebMvc ist.

Obwohl Sie denken Sie keine WebApplicationContext (und somit eine ServletContext) benötigen, benötigen Sie dies tatsächlich, einfach weil Sie einen Anwendungskontext mit @EnableWebMvc laden.

Sie haben zwei Möglichkeiten:

  • Stellen Sie die Konfigurationsklassen für Ihren Integrationstest so zusammen, dass Sie die webbezogene Konfiguration nicht einschließen (d. H. Die mit @Configuration annotierten @EnableWebMvc-Klasse (n)).
  • Kommentieren Sie Ihre Testklasse mit @WebAppConfiguration, wie in anderen Kommentaren oben vorgeschlagen.

Grüße,

Sam (Autor des Spring TestContext Framework)

135
Sam Brannen

Es scheint, dass Sie vermisst werden

@WebAppConfiguration

aus Ihrer Testklasse.

Die Dokumentation Zustände

Der Ressourcenbasispfad wird im Hintergrund verwendet, um eine .__ zu erstellen. MockServletContext, der als ServletContext für die .__ des Tests dient. WebApplicationContext.

Normalerweise würde ein Servlet-Container die ServletContext bereitstellen. Da Sie sich in einer Testumgebung befinden, benötigen Sie eine Fälschung. @WebAppConfiguration liefert das.

36

Damit Sie den Servlet-Kontext instanziieren können, müssen Sie die Annotation verwenden. 

@WebAppConfiguration

Eine Annotation auf Klassenebene, die verwendet wird, um anzugeben, dass der für einen Integrationstest geladene ApplicationContext ein WebApplicationContext sein sollte. Das bloße Vorhandensein von @WebAppConfiguration in einer Testklasse stellt sicher, dass ein WebApplicationContext für den Test geladen wird, wobei der Standardwert "file: src/main/webapp" für den Pfad zum Stammverzeichnis der Webanwendung (dh der Ressource) verwendet wird Basispfad). Der Ressourcenbasispfad wird im Hintergrund verwendet, um einen MockServletContext zu erstellen, der als ServletContext für den WebApplicationContext des Tests dient.

10
Hrishikesh

Ich habe einen ähnlichen Fehler erhalten, aber während ich die Anwendung normalerweise ausführte, anstatt zu versuchen, Tests auszuführen.

Es stellt sich heraus, dass Sie, wenn Sie eine benutzerdefinierte PermissionEvaluator verwenden, diese in einer separaten @Configuration-Klasse für die Spring-Sicherheitskonfiguration definieren müssen.

Siehe: Wie füge ich einem Spring Boot-Projekt eine methodenbasierte Sicherheit hinzu?

Es gibt auch eine offene Github-Ausgabe: https://github.com/spring-projects/spring-boot/issues/4875

0
Robert Hunt