web-dev-qa-db-fra.com

java.lang.IllegalArgumentException: un ServletContext est requis pour configurer la gestion des servlets par défaut

J'ai la classe de test suivante:

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

Le problème semble provenir de la classe 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 {

}

Je reçois systématiquement cette exception:

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

Je ne sais pas trop comment résoudre ce problème. Quelque part Spring cherche un ServletContext quand je lance le test et que je reçois l'exception ci-dessus ...

55
balteo

Une de vos classes @Configuration est évidemment annotée avec @EnableWebMvc. C'est ainsi que DelegatingWebMvcConfiguration finit dans votre trace de pile, puisqu'il est importé par @EnableWebMvc.

Donc bien que vous pensez que vous n’ayez pas besoin de WebApplicationContext (et donc de ServletContext), vous en avez réellement besoin simplement parce que vous chargez un contexte d’application avec @EnableWebMvc.

Vous avez deux options:

  • Composez les classes de configuration pour votre test d'intégration afin que vous n'incluiez pas la configuration Web (c'est-à-dire les classes @Configuration annotées avec @EnableWebMvc).
  • Annotez votre classe de test avec @WebAppConfiguration comme suggéré dans les autres commentaires ci-dessus.

Cordialement,

Sam (auteur du Spring TestContext Framework)

135
Sam Brannen

Il semble que tu manques

@WebAppConfiguration

de votre classe de test.

La documentation États

Le chemin de la base de ressources est utilisé en arrière-plan pour créer un fichier MockServletContext qui sert de ServletContext pour le test WebApplicationContext.

Généralement, un conteneur de servlet fournit la variable ServletContext. Puisque vous êtes dans un environnement de test, vous avez besoin d’un faux. @WebAppConfiguration fournit cela.

36

Pour pouvoir instancier le contexte Servlet, vous devez utiliser l'annotation. 

@WebAppConfiguration

Une annotation de niveau classe utilisée pour déclarer que le champ ApplicationContext chargé pour un test d'intégration doit être un WebApplicationContext. La simple présence de @WebAppConfiguration sur une classe de test garantit qu'un WebApplicationContext sera chargé pour le test, en utilisant la valeur par défaut de "fichier: src/main/webapp" pour le chemin d'accès à la racine de l'application Web chemin de base). Le chemin de base des ressources est utilisé en arrière-plan pour créer un MockServletContext qui sert de ServletContext pour le test WebApplicationContext.

10
Hrishikesh

J'obtenais une erreur similaire, mais tout en exécutant l'application normalement plutôt que d'essayer d'exécuter des tests.

Il s'avère que si vous utilisez un PermissionEvaluator personnalisé, vous devez le déclarer dans une classe @Configuration distincte de celle avec votre configuration de sécurité Spring principale dans.

Voir: Comment ajouter une sécurité basée sur une méthode à un projet Spring Boot?

Il y a aussi un numéro ouvert de Github: https://github.com/spring-projects/spring-boot/issues/4875

0
Robert Hunt