java.lang.IllegalArgumentException: un ServletContext est requirejs pour configurer la gestion du servlet 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.(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() at org.springframework.web.servlet.config.annotation.DelegatingWebMvcConfiguration$$EnhancerByCGLIB$$bb4ceb44$$FastClassByCGLIB$$368bb5c1.invoke() 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() 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 comment contourner ce problème. Quelque part, Spring recherche un ServletContext lorsque je lance le test et que je reçois l’exception ci-dessus …

Une de vos classes @Configuration est évidemment annotée avec @EnableWebMvc . Voilà comment DelegatingWebMvcConfiguration se retrouve dans votre trace de stack, car il est importé par @EnableWebMvc .

Donc, bien que vous ne pensiez pas avoir besoin d’un WebApplicationContext (et donc d’un ServletContext ), vous en avez 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 de ne pas inclure 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 framework Spring TestContext)

Il semble que tu manques

 @WebAppConfiguration 

de votre classe de test.

La documentation indique

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

En général, un conteneur Servlet fournira le ServletContext . Comme vous êtes dans un environnement de test, vous avez besoin d’un faux. @WebAppConfiguration fournit cela.

Pour que vous puissiez instancier le contexte Servlet, vous devez utiliser l’annotation.

 @WebAppConfiguration 

Une annotation au niveau de la classe utilisée pour déclarer que 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 “file: src / main / webapp” pour le chemin d’access à la racine de l’application Web (la ressource chemin de base). Le chemin de la base de ressources est utilisé en arrière-plan pour créer un MockServletContext qui sert de ServletContext pour WebApplicationContext du test.

Je recevais une erreur similaire mais en exécutant normalement l’application plutôt que d’essayer d’exécuter des tests.

Si vous utilisez un PermissionEvaluator personnalisé, vous devez le déclarer dans une classe @Configuration distincte de celle qui @Configuration votre configuration de sécurité Spring principale.

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

Il existe également un numéro Github ouvert: https://github.com/spring-projects/spring-boot/issues/4875