복붙노트

[SPRING] SpringServletContainerInitializer를 javax.servlet.ServletContainerInitializer에 캐스팅 할 수 없습니다.

SPRING

SpringServletContainerInitializer를 javax.servlet.ServletContainerInitializer에 캐스팅 할 수 없습니다.

XML 기반 스프링 MVC 응용 프로그램을 Java 구성 기반 응용 프로그램으로 이동하려고합니다. 메이븐에서 사용할 수있는 다양한 java.servlet 클래스와의 불일치가있는 것으로 보입니다. 예를 들어, 일부는 addServlet () 메소드를 제공하고 일부 메소드는 제공하지 않습니다.

다음은 내 config 클래스입니다.

public class MyWebAppInitializer implements WebApplicationInitializer {
    @Override
    public void onStartup(ServletContext container) throws ServletException {

        AnnotationConfigWebApplicationContext rootContext =
                new AnnotationConfigWebApplicationContext();
        rootContext.register(JpaSandboxConf.class);

        ServletRegistration.Dynamic registration = container.addServlet("dispatcher", new DispatcherServlet());
        registration.setLoadOnStartup(1);
        registration.addMapping("/myapp/*");
    }
}

어느 것이 다소 논쟁의 여지가없는 것처럼 보입니다. 얻기 위해서

container.addServlet()

방법, 나는 이것을 pom에 포함시켰다 :

<dependency>
    <groupId>org.apache.tomcat</groupId>
    <artifactId>tomcat-servlet-api</artifactId>
    <version>7.0.30</version>
</dependency>

나는 이것을 시도했지만 ServletContext 클래스는 아래의 엔트리에서 작동하지 않았다. (addServlet () 메소드를 제공하지 않았다는 점에서) :

<dependency>
    <groupId>javax.servlet</groupId>
    <artifactId>com.springsource.javax.servlet</artifactId>
    <version>2.5.0</version>
    <scope>provided</scope>
</dependency>

내가 이것을 실행할 때

mvn clean tomcat7:run

나는 불행하게도 얻는다.

SEVERE: A child container failed during start
java.util.concurrent.ExecutionException: org.apache.catalina.LifecycleException: Failed to start component [StandardEngine[Tomcat].StandardHost[localhost].StandardContext[/]]
    at java.util.concurrent.FutureTask$Sync.innerGet(FutureTask.java:252)
    at java.util.concurrent.FutureTask.get(FutureTask.java:111)
    at org.apache.catalina.core.ContainerBase.startInternal(ContainerBase.java:1130)
    at org.apache.catalina.core.StandardHost.startInternal(StandardHost.java:782)
    at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)
    at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1568)
    at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1558)
    at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:334)
    at java.util.concurrent.FutureTask.run(FutureTask.java:166)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
    at java.lang.Thread.run(Thread.java:722)
Caused by: org.apache.catalina.LifecycleException: Failed to start component [StandardEngine[Tomcat].StandardHost[localhost].StandardContext[/]]
    at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:154)
    ... 7 more
Caused by: java.lang.ClassCastException: org.springframework.web.SpringServletContainerInitializer cannot be cast to javax.servlet.ServletContainerInitializer
    at org.apache.catalina.startup.ContextConfig.getServletContainerInitializer(ContextConfig.java:1543)
    at org.apache.catalina.startup.ContextConfig.processServletContainerInitializers(ContextConfig.java:1464)
    at org.apache.catalina.startup.ContextConfig.webConfig(ContextConfig.java:1190)
    at org.apache.catalina.startup.ContextConfig.configureStart(ContextConfig.java:825)
    at org.apache.catalina.startup.ContextConfig.lifecycleEvent(ContextConfig.java:300)
    at org.apache.catalina.util.LifecycleSupport.fireLifecycleEvent(LifecycleSupport.java:119)
    at org.apache.catalina.util.LifecycleBase.fireLifecycleEvent(LifecycleBase.java:90)
    at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5161)
    at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)
    ... 7 more

하나의 클래스는 Spring 프레임 워크에서 나오고 다른 하나는 javax.servlet에서 오는 것을 볼 수 있습니다.하지만이 메소드는 Spring 제공 클래스로부터 존재하지 않습니다. (이 예제는 Spring 3.2 문서 자체 내에 존재하기 때문에 실망 스럽습니다.

나는 Spring 3.2를 사용하고있다. 나는 이클립스를 사용하지 않고있다. (모든 예제는 이클립스 기반이다. 나는 IntelliJ에있다.) 이것은 maven 프로젝트입니다.

도와 주셔서 감사합니다.

해결법

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

    1.pom에있는 더 나은 서블릿 3.0 API 의존성 항목은 https://github.com/SpringSource/greenhouse/tree/servlet3에서 사용할 수 있습니다. 또한 제공된 범위를 표시해야합니다. 그렇지 않으면 병이 최종 전쟁에 포함됩니다. 귀하의 경우에 발생하는 것으로 보이는 용기가 제공하는 병을 방해하십시오.

    pom에있는 더 나은 서블릿 3.0 API 의존성 항목은 https://github.com/SpringSource/greenhouse/tree/servlet3에서 사용할 수 있습니다. 또한 제공된 범위를 표시해야합니다. 그렇지 않으면 병이 최종 전쟁에 포함됩니다. 귀하의 경우에 발생하는 것으로 보이는 용기가 제공하는 병을 방해하십시오.

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

    2.나는 Spring없이 mvn tomcat7 : run이 작동하지 않는 서블릿이 OpenShift에 잘 배치되어 있음에도 불구하고 비슷한 문제를 가지고있었습니다. Biju Kunjummen의 대답에 따르면, 나를위한 문제는 내가 컴파일하고 있던 servlet-api였습니다.

    나는 Spring없이 mvn tomcat7 : run이 작동하지 않는 서블릿이 OpenShift에 잘 배치되어 있음에도 불구하고 비슷한 문제를 가지고있었습니다. Biju Kunjummen의 대답에 따르면, 나를위한 문제는 내가 컴파일하고 있던 servlet-api였습니다.

    부서진:

    <dependency>
        <groupId>javax.servlet</groupId>
        <artifactId>javax.servlet-api</artifactId>
        <version>3.0.1</version>
        <scope>provided</scope>
    </dependency>
    

    결정된:

    <dependency>
        <groupId>org.mortbay.jetty</groupId>
        <artifactId>servlet-api</artifactId>
        <version>3.0.20100224</version>
        <scope>provided</scope>
    </dependency>
    

    그 이유는 끔찍하지 않지만 지금은 효과가 있습니다.

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

    3.나는 같은 문제에 직면했다 wis gradple tomcat plugin. 나는 tomcat 버전을 8로 업데이트했고 제대로 작동했다.

    나는 같은 문제에 직면했다 wis gradple tomcat plugin. 나는 tomcat 버전을 8로 업데이트했고 제대로 작동했다.

    plugins {
        id "com.bmuschko.tomcat" version "2.2.2"
        id "java"
        id "eclipse"
        id "idea"
        id "war"
    }
    
    
    dependencies {
        providedCompile ('javax.servlet:javax.servlet-api:3.1.0')
        providedCompile ('javax.servlet.jsp:jsp-api:2.2')
        compile ('org.springframework:spring-webmvc:4.2.1.RELEASE')
    
        def tomcatVersion = '8.0.27'
        tomcat "org.apache.tomcat.embed:tomcat-embed-core:${tomcatVersion}",
                "org.apache.tomcat.embed:tomcat-embed-logging-juli:${tomcatVersion}",
                "org.apache.tomcat.embed:tomcat-embed-jasper:${tomcatVersion}"
    
    }
    
  4. ==============================

    4.나는 사용했다. provideCompile 'javax.servlet : javax.servlet-api : 3.1.0' 문제를 해결하기 위해

    나는 사용했다. provideCompile 'javax.servlet : javax.servlet-api : 3.1.0' 문제를 해결하기 위해

  5. ==============================

    5.Eclipse에서 Tomcat을 사용할 때도 동일한 오류가 발생합니다.

    Eclipse에서 Tomcat을 사용할 때도 동일한 오류가 발생합니다.

    서버 탭으로 이동하여이 문제를 해결합니다. Tomcat을 두 번 클릭하고 "게시하지 않고 모듈 게시"확인란의 선택을 취소하십시오.

  6. from https://stackoverflow.com/questions/15328363/springservletcontainerinitializer-cannot-be-cast-to-javax-servlet-servletcontain by cc-by-sa and MIT license