it-swarm.dev

java.lang.IllegalArgumentException: wymagany jest ServletContext do skonfigurowania domyślnej obsługi serwletów

Mam następującą klasę testową:

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

Problem wydaje się pochodzić z klasy 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 {

}

Systematycznie otrzymuję ten wyjątek:

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

Nie wiem, jak obejść ten problem. W jakiś sposób Spring szuka ServletContext podczas uruchamiania testu i otrzymuję powyższy wyjątek ...

55
balteo

Jedna z klas @Configuration jest oczywiście opatrzona adnotacją @EnableWebMvc. W ten sposób zmienna DelegatingWebMvcConfiguration trafia na ślad stosu, ponieważ jest importowana przez @EnableWebMvc.

Więc chociaż myślicie nie potrzebujecie WebApplicationContext (a stąd ServletContext), faktycznie tego potrzebujecie, ponieważ ładujecie kontekst aplikacji za pomocą @EnableWebMvc.

Masz dwie opcje:

  • Skomponuj klasy konfiguracji dla testu integracji, aby nie uwzględniać konfiguracji związanej z siecią (tj. Klasy (y) @Configuration z adnotacją @EnableWebMvc).
  • Adnotuj swoją klasę testową za pomocą @WebAppConfiguration, jak sugerowano w innych komentarzach powyżej.

Pozdrowienia,

Sam (autor Spring TestContext Framework)

135
Sam Brannen

Wygląda na to, że brakuje ci

@WebAppConfiguration

z twojej klasy testowej.

dokumentacja states

Ścieżka bazy zasobów jest używana za kulisami, aby utworzyć MockServletContext, który służy jako kontekst ServletContext dla testu WebApplicationContext.

Zazwyczaj kontener serwletów zapewnia zmienną ServletContext. Ponieważ jesteś w środowisku testowym, potrzebujesz fałszywego. @WebAppConfiguration to zapewnia.

36

Aby utworzyć instancję kontekstu serwletu, należy użyć adnotacji. 

@WebAppConfiguration

Adnotacja na poziomie klasy używana do deklarowania, że ​​ładowanie ApplicationContext dla testu integracji powinno być kontekstem WebApplicationContext. Sama obecność @WebAppConfiguration na klasie testowej gwarantuje, że WebApplicationContext zostanie załadowany do testu, używając domyślnej wartości „file: src/main/webapp” dla ścieżki do katalogu głównego aplikacji internetowej (tj. Zasobu ścieżka bazowa). Ścieżka bazowa zasobów jest używana za scenami w celu utworzenia MockServletContext, który służy jako kontekst ServletContext dla WebApplicationContext testu.

10
Hrishikesh

Otrzymałem podobny błąd, ale podczas normalnego działania aplikacji, zamiast próbować uruchomić testy.

Okazuje się, że jeśli używasz niestandardowej zmiennej PermissionEvaluator, musisz zadeklarować ją w oddzielnej klasie @Configuration do tej z główną konfiguracją zabezpieczeń Spring.

Zobacz: Jak dodać zabezpieczenia oparte na metodzie do projektu Spring Boot?

Istnieje również otwarty problem Github: https://github.com/spring-projects/spring-boot/issues/4875

0
Robert Hunt