我正试图从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>
请帮帮我。
答案 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文件夹中并启动,如果通过控制台它工作正常。我没有区别。 有什么想法吗?