web-dev-qa-db-fra.com

SpringServletContainerInitializer ne peut pas être converti en javax.servlet.ServletContainerInitializer

J'essaie de déplacer une application Spring MVC basée sur XML vers une application basée sur la configuration Java. Il semble y avoir un décalage entre les différentes classes Java.servlet disponibles dans maven. Par exemple, certains fournissent la méthode addServlet () et d'autres non.

Voici ma classe de configuration:

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/*");
    }
}

Ce qui semble plutôt controversé. Afin d'obtenir le 

container.addServlet()

méthode, je l'ai inclus dans mon pom:

<dependency>
    <groupId>org.Apache.Tomcat</groupId>
    <artifactId>Tomcat-servlet-api</artifactId>
    <version>7.0.30</version>
</dependency>

J'ai essayé ceci, mais la classe ServletContext de l'entrée ci-dessous DID ne fonctionnait pas (en ce sens qu'elle ne fournissait pas la méthode addServlet ()):

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

Quand j'essaye d'exécuter ceci en utilisant

mvn clean Tomcat7:run

J'obtiens malheureusement

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

Je vois qu'une classe provient du framework Spring et l'autre de javax.servlet, mais encore une fois, la méthode n'existe pas à partir de la classe fournie par Spring (ce qui est frustrant, car cet exemple existe dans la documentation Spring 3.2 elle-même.

J'utilise Spring 3.2. Je n'utilise pas Eclipse (tous les exemples sont basés sur Eclipse, je suis dans IntelliJ). Ceci est un projet maven

J'apprécie votre aide.

15
Brian Dolan

Une meilleure entrée de dépendance de servlet 3.0 api dans pom est disponible ici - https://github.com/SpringSource/greenhouse/tree/servlet3 , vous devez également marquer l'étendue avec provided, sinon le pot sera inclus dans votre guerre finale qui va interférer avec le pot fourni par le conteneur qui est ce qui semble se passer dans votre cas.

21
Biju Kunjummen

J'ai eu un problème similaire sans Spring, où mvn Tomcat7:run ne fonctionnait pas, malgré le déploiement du servlet sur OpenShift. Selon la réponse de Biju Kunjummen, le problème pour moi était de savoir contre quel servlet-api je compilais.

Cassé:

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

Fixé:

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

Je ne sais pas trop pourquoi, mais ça fonctionne maintenant.

12
KevinL

Je faisais face au même problème avec le plugin Tomcat. J'ai mis à jour la version Tomcat à 8 et cela a fonctionné.

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}"

}
2
abhi shukla

Je suis confronté à la même erreur lorsque j'utilise Tomcat dans Eclipse. 

Je résous ce problème en allant dans l'onglet Serveurs> double-cliquez sur Tomcat et décochez la case "Servir les modules sans publication".

1
Mrye

J'ai utilisé providedCompile 'javax.servlet:javax.servlet-api:3.1.0'pour résoudre le problème

1
Saurabh