2013-03-10 11 views
13

Sto tentando di spostare un'applicazione Spring MVC basata su xml su un'app basata su Java Configuration. Sembra che ci sia una mancata corrispondenza con le varie classi java.servlet disponibili in Maven. Ad esempio, alcuni forniscono il metodo addServlet() e altri no.SpringServletContainerInitializer non può essere lanciato su javax.servlet.ServletContainerInitializer

Ecco la mia classe di configurazione:

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

Che sembra piuttosto incontrovertibile. Al fine di ottenere il metodo

container.addServlet() 

, ho incluso nel mio pom:

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

ho provato questo, ma la classe ServletContext dall'entrata in basso non ha funzionato (in quanto didnot fornire la metodo addServlet()):

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

Quando si tenta di eseguire questo utilizzando

mvn clean tomcat7:run 

io purtroppo ottengo

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 

vedo che una classe proviene Spring framework e l'altro da javax.servlet, ma ancora una volta, il metodo non esiste dalla classe Spring fornito (che è frustrante, perché questo esempio esiste all'interno della stessa documentazione Spring 3.2.

Sto usando Spring 3.2. NON sto usando Eclipse (tutti gli esempi sono basati su Eclipse, sono in IntelliJ). Questo è un progetto maven

Apprezzo il vostro aiuto.

+0

possibile duplicato del [ServletDispatcher non può essere lanciato ad eccezione Javax.servlet.Servlet nel mio progetto primavera] (http://stackoverflow.com/questions/11704069/servletdispatcher-cannot-be-cast-to-javax-servlet-servlet-exception-in-my-spring) – Rugal

risposta

20

Una migliore servlet 3.0 api ingresso dipendenza nel pom è disponibile qui - https://github.com/SpringSource/greenhouse/tree/servlet3, si dovrebbe anche segnare la portata di provided, altrimenti il ​​vaso sarà incluso nella vostra guerra finale che interferisca con il barattolo fornito dal contenitore che è quello che sembra stia accadendo nel tuo caso.

10

Ho avuto un problema simile senza Spring, dove mvn tomcat7:run non ha funzionato, nonostante il servlet che esegue la distribuzione su OpenShift. Come per la risposta di Biju Kunjummen, il problema per me era il servlet-ap che stavo compilando contro.

rotto:

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

fisso:

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

Non eccessivamente sicuro perché, ma funziona ora.

2

Ero di fronte allo stesso problema con il plugin gradle tomcat. Ho aggiornato la versione di tomcat su 8 e ha funzionato.

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

} 
1

ho usato providedCompile 'javax.servlet:javax.servlet-api:3.1.0' per risolvere il problema

0

sto affrontando lo stesso errore quando si utilizza Tomcat in Eclipse.

risolvo questo andando a scheda Server> fare doppio clic sul Tomcat e deselezionare la casella "Servire moduli senza editrice"

Problemi correlati