2013-03-10 30 views
13

xmlベースのSpring MVCアプリケーションをJava Configurationベースのアプリケーションに移動しようとしています。 mavenで利用できるさまざまなjava.servletクラスとの不一致があるようです。例えば、いくつかはaddServlet()メソッドを提供し、いくつかは提供しません。むしろ異論思わSpringServletContainerInitializerをjavax.servlet.ServletContainerInitializerにキャストできません

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

は、ここに私のconfigクラスです。

container.addServlet() 

方法を得るために、私は私のポンポンでこれを含める:

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

それが提供didnotことで(私はこれを試してみましたが、以下のエントリからの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 

私は1つのクラスはのjavax.servletから他方をSpringフレームワークから来ていることがわかり、しかし再び、方法がイライラしている(春提供クラスから存在していません、この例はSpring 3.2ドキュメント自体の中に存在するからです。

私はSpring 3.2を使用しています。私はEclipseを使用していません(すべての例はEclipseベースですが、IntelliJにあります)。これはmavenプロジェクトです

私はあなたの助けに感謝します。

+0

が重複する可能性「を公開せずサーブモジュール」のチェックを外し> [サーバー]タブに移動して、これを解決http://stackoverflow.com/questions/11704069/servletdispatcher-cannot-be-cast-to-javax-servlet-servlet-exception-in-my-spring) – Rugal

答えて

20

ここでは、https://github.com/SpringSource/greenhouse/tree/servlet3のサーブレット3.0のapi依存関係エントリを利用できますが、スコープにはprovidedとマークする必要があります。そうしないと、最終戦争にJARファイルが含まれます。あなたの場合に起こっているようです。

10

OpenShiftにデプロイするサーブレットにもかかわらず、mvn tomcat7:runが動作しなかったSpringがなければ、同様の問題が発生しました。 Biju Kunjummenの答えによると、私の問題は、私がコンパイルしていたservlet-apiでした。壊れた

:なぜ

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

ひどくわからないが、それが動作するようになりました:

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

を修正しました。

2

私は同じ問題に直面していました。私は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}" 

} 
1

私は、EclipseでTomcatを使用しているとき、私は同じエラーが直面しています発行し

0

を解決するために providedCompile 'javax.servlet:javax.servlet-api:3.1.0' を使用。

私はダブルTomcatをクリックして([ServletDispatcherは私の春のプロジェクトでのjavax.servlet.Servlet例外にキャストすることはできません]の

関連する問題