복붙노트

[SPRING] java.lang.IllegalArgumentException : 디폴트 서블릿 처리를 설정하려면 ServletContext가 필요합니다.

SPRING

java.lang.IllegalArgumentException : 디폴트 서블릿 처리를 설정하려면 ServletContext가 필요합니다.

다음 테스트 클래스가 있습니다.

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

이 문제는 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 {

}

나는 체계적으로이 예외를 얻는다 :

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

이 문제를 해결하는 방법을 모르겠습니다. 어떻게 든 테스트를 실행하면 Spring이 ServletContext를 찾고 위의 예외가 발생합니다 ...

해결법

  1. ==============================

    1.@Configuration 클래스 중 하나에는 @EnableWebMvc가 명시 적으로 주석되어 있습니다. 이것이 DelegatingWebMvcConfiguration이 @EnableWebMvc에 의해 임포트되기 때문에 스택 트레이스에서 끝나는 방식입니다.

    @Configuration 클래스 중 하나에는 @EnableWebMvc가 명시 적으로 주석되어 있습니다. 이것이 DelegatingWebMvcConfiguration이 @EnableWebMvc에 의해 임포트되기 때문에 스택 트레이스에서 끝나는 방식입니다.

    그래서 당신이 WebApplicationContext (그리고 ServletContext)를 필요로하지 않는다고 생각할지라도, 당신은 @EnableWebMvc로 어플리케이션 컨텍스트를로드하기 때문에 실제로 그것을 필요로합니다.

    두 가지 옵션이 있습니다.

    문안 인사,

    Sam (Spring TestContext Framework 작성자)

  2. ==============================

    2.너 빠진 것 같아.

    너 빠진 것 같아.

    @WebAppConfiguration
    

    테스트 클래스에서.

    문서 상태

    일반적으로 Servlet 컨테이너는 ServletContext를 제공합니다. 테스트 환경에 있기 때문에 가짜가 필요합니다. @WebAppConfiguration은이를 제공합니다.

  3. ==============================

    3.Servlet 컨텍스트를 인스턴스화하려면 주석을 사용해야한다.

    Servlet 컨텍스트를 인스턴스화하려면 주석을 사용해야한다.

    @WebAppConfiguration
    

    통합 테스트를 위해로드 된 ApplicationContext가 WebApplicationContext 여야한다고 선언하는 데 사용되는 클래스 수준 주석. 테스트 클래스에 @WebAppConfiguration이 존재하는 것만으로 웹 애플리케이션 루트에 대한 경로에 "file : src / main / webapp"라는 기본값을 사용하여 테스트를 위해 WebApplicationContext가로드되도록합니다 (즉, 리소스 기본 경로). 리소스베이스 경로는 백그라운드에서 사용되어 테스트의 WebApplicationContext에 대한 ServletContext 역할을하는 MockServletContext를 생성합니다.

  4. ==============================

    4.유사한 오류가 발생했지만 테스트를 실행하는 대신 응용 프로그램을 정상적으로 실행하는 중이었습니다.

    유사한 오류가 발생했지만 테스트를 실행하는 대신 응용 프로그램을 정상적으로 실행하는 중이었습니다.

    커스텀 PermissionEvaluator를 사용하고 있다면 Spring의 주 보안 설정을 가진 별도의 @Configuration 클래스에서 선언해야한다.

    참조 : 스프링 부트 프로젝트에 메소드 기반 보안을 추가하려면 어떻게해야합니까?

    오픈 Github 문제도 있습니다 : https://github.com/spring-projects/spring-boot/issues/4875

  5. from https://stackoverflow.com/questions/21516683/java-lang-illegalargumentexception-a-servletcontext-is-required-to-configure-de by cc-by-sa and MIT license