Vaadin 7 Servlet ClassCastException

时间:2013-03-04 18:08:43

标签: java vaadin

我正试图从Vaadin 6迁移到Vaadin 7 当我尝试打开应用程序URL时,我得到一个ClassCastException

SEVERE: Allocate exception for servlet Vaadin Application Servlet
java.lang.ClassCastException: com.vaadin.server.VaadinServlet cannot be cast to javax.servlet.Servlet
    at org.apache.catalina.core.StandardWrapper.loadServlet(StandardWrapper.java:1136)
    at org.apache.catalina.core.StandardWrapper.allocate(StandardWrapper.java:857)
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:136)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:123)
    at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:472)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:168)
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:99)
    at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:929)
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:407)
    at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1002)
    at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:585)
    at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:310)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
    at java.lang.Thread.run(Unknown Source)

我无法理解什么是错的,因为似乎web.xml没问题。 应用程序servlet的映射如下所列

 <servlet>
        <servlet-name>Ohta Application</servlet-name>
        <servlet-class>com.vaadin.server.VaadinServlet</servlet-class>
        <init-param>
            <description>
        Vaadin UI class to use</description>
            <param-name>UI</param-name>
            <param-value>com.ritmsoft.ohta.OhtaUI</param-value>
        </init-param>
        <init-param>
            <param-name>widgetset</param-name>
            <param-value>com.ritmsoft.ohta.widgetset.OhtaWidgetSet</param-value>
        </init-param>
    </servlet>
    <servlet-mapping>
        <servlet-name>Ohta Application</servlet-name>
        <url-pattern>/*</url-pattern>
    </servlet-mapping>
    <servlet-mapping>
        <servlet-name>Ohta Application</servlet-name>
        <url-pattern>/VAADIN/*</url-pattern>
    </servlet-mapping>

请帮帮我。

3 个答案:

答案 0 :(得分:2)

或者,如果你使用Maven,你的servlet范围就像“提供”那样:

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

这样它将使用容器的servlet jar版本(如果存在),否则它将使用你在Maven中声明的版本。

答案 1 :(得分:1)

问题很可能是由多个类加载器加载javax.servlet.Servlet引起的。它通常存在于servlet*.jar中。容器可能提供了自己的jar版本,而您的应用程序提供了另一个版本。尝试删除战争中的那个。

答案 2 :(得分:0)

我在这里遇到同样的问题,但前提是我尝试用ecat的tomcat插件运行vaadin maven项目。 serlet-api的依赖性完全如上所示。如果我完全评论它或仅仅是范围部分,那么没有区别。 lib文件夹中总是有一个servlet-api-2.5-6.1.11。我不知道这是从哪里来的。但是在提供的范围内,lib文件夹中肯定没有javax.servlet-api.jar。 如果我将战争manuelly复制到tomcats webapps文件夹中并启动,如果通过控制台它工作正常。我没有区别。 有什么想法吗?