Java.lang.IllegalArgumentException: un ServletContext est nécessaire pour configurer la gestion de servlet par défaut
j'ai la classe d'essai 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 de configuration de Basetest:
@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 {
}
j'obtiens 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(<generated>)
at org.springframework.web.servlet.config.annotation.DelegatingWebMvcConfiguration$$EnhancerByCGLIB$$bb4ceb44$$FastClassByCGLIB$8bb5c1.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 suis pas sûr de savoir comment contourner cette question. Quelque part Spring est à la recherche D'un ServletContext lorsque j'exécute le test et je reçois l'exception ci-dessus...
4 réponses
l'une de vos classes @Configuration
est évidemment annotée de @EnableWebMvc
. C'est ainsi que DelegatingWebMvcConfiguration
finit dans votre trace de pile, puisqu'il est importé par @EnableWebMvc
.
donc bien que vous pensez vous n'avez pas besoin d'un WebApplicationContext
(et donc d'un ServletContext
), vous en avez en fait 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 de sorte que vous n'incluez pas la configuration liée au web (c.-à-d. la(les) classe (s)
@Configuration
annotée (s) de@EnableWebMvc
). - annoter votre classe de test avec
@WebAppConfiguration
comme suggéré dans d'autres commentaires ci-dessus.
Cordialement,
Sam (auteur du cadre Spring TestContext)
on dirait que tu as disparu
@WebAppConfiguration
de votre classe de test.
Le documentation états
le chemin de la base de ressources est utilisé dans les coulisses pour créer un MockServletContext qui sert de ServletContext pour les WebApplicationContext.
en général, un conteneur à Servlet fournit le ServletContext
. Depuis vous êtes dans un environnement de test, vous avez besoin d'un faux. @WebAppConfiguration
prévoit cela.
pour que vous instanciez le contexte Servlet, vous devez utiliser l'annotation.
@WebAppConfiguration
annotation au niveau de la classe qui est utilisée pour déclarer que L'ApplicationContext chargé pour un test d'intégration devrait être un WebApplicationContext. La simple présence de @WebAppConfiguration sur une classe de test garantit qu'un context Webapplicationcon sera chargé pour le test, en utilisant la valeur par défaut de "file: src / main / webapp" pour le chemin à la racine du web application (c.-à-d. le chemin de la base de ressources). Le chemin de la base de ressources est utilisé dans les coulisses pour créer un Contextemockservlet qui sert de Contextservlet pour le context Webapplicationdu test.
j'ai eu une erreur similaire mais 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é alors vous devez le déclarer dans une classe @Configuration
séparée de celle avec votre configuration de sécurité principale de ressort.
Voir: Comment puis-je ajouter une méthode à base de sécurité à un Ressort de Démarrage du projet?
Il ya aussi un ouvert Numéro Github: https://github.com/spring-projects/spring-boot/issues/4875