ServletDispatcher 无法在我的 spring 项目中强制转换为 Javax.servlet.Servlet 异常
Posted
技术标签:
【中文标题】ServletDispatcher 无法在我的 spring 项目中强制转换为 Javax.servlet.Servlet 异常【英文标题】:ServletDispatcher cannot be cast to Javax.servlet.Servlet exception in my spring project 【发布时间】:2012-07-27 02:12:40 【问题描述】:在启动 tomcat 服务器时出现异常
SEVERE: Servlet /MavenWeb threw load() exception
java.lang.ClassCastException: org.springframework.web.servlet.DispatcherServlet
cannot be cast to javax.servlet.Servlet
我正在使用 spring3,但我的 lib 文件夹中有 jar spring2-5-6,我从 pom.xml 中删除了它,但仍然出现在 lib 文件夹中 - 尽管我不确定这是否是一个问题。我正在使用 Eclipse IDE。谢谢!!
<dependencies>
<dependency>
<groupId>org.hibernate.javax.persistence</groupId>
<artifactId>hibernate-jpa-2.1-api</artifactId>
<version>1.0.0.Draft-6</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-annotations</artifactId>
<version>3.5.6-Final</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-beans</artifactId>
<version>3.1.2.RELEASE</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>3.1.2.RELEASE</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
<version>3.1.2.RELEASE</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-tx</artifactId>
<version>3.1.2.RELEASE</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>3.1.2.RELEASE</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.1-b01</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webflow</artifactId>
<version>1.0.6</version>
<scope>compile</scope>
</dependency>
</dependencies>
【问题讨论】:
就我而言,我从 pom.xml 中删除了 javax.servlet 条目,而是在我的类路径中添加了 tomcat 库。 【参考方案1】:您不应该在一个项目中使用多个版本的 Spring JAR,但这不是问题。
这个问题很可能是由两个不同的类加载器加载的 servlet API 类引起的。您的 WAR 中可能有 servlet*.jar
或其他一些特定于容器的 JAR。通过在pom.xml
中将<scope>
设置为provided
来删除它们。
【讨论】:
我的 pom.xml 中只有 javax.servlet-api 用于 servlet。其余都是 org.springframework 的 spring-webmvc、spring-webflow、spring-tx、spring-web、spring-beans 和 hibernate-annotations 的工件。我从上面的 pom.xml 中发布了依赖项。谢谢。 @Manth:正如我所说,只需将javax.servlet-api
的范围更改为provided
。有帮助吗?
Nurkiewiczit:没用。正如你所说,我确实将 javax.servlet-api 更改为提供。编译后我仍然在我的 target/web-inf/lib 文件夹中看到 javax.servlet-api-3.1-b01.jar。
请解释一下为什么不使用多个版本的 spring jar?我同意防止这种情况是一个很好的主意,但是如果你想使用 websockets 和 spring security 你必须使用 spring4 并且 spring security 包使用 spring 3.2
就我而言,我必须提供我的 tomcat-api 范围【参考方案2】:
就我而言,库没有问题。我正在更改要使用 Spring 实现的标准 Servlet,因此我遵循了 these instructions,我在此解释一下,以防页面稍后出现故障:
实现 org.springframework.web.HttpRequestHandler
而不是扩展 javax.Servlet
public class MyServlet implements HttpRequestHandler
在 applicationContext.xml 中创建了 bean(我是在 dispatcher-servlet.xml 中创建的)
<bean id="MyServlet" class="com.package.to.MyServlet"/>
在 Web.xml 中指定 servlet,将旧类 (com.package.to.MyServlet) 更改为 Spring HttpRequestHandlerServlet。
<servlet>
<servlet-name>MyServlet</servlet-name>
<servlet-class>org.springframework.web.context.support.HttpRequestHandlerServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>MyServlet</servlet-name>
<url-pattern>/MyServlet</url-pattern>
</servlet-mapping>
我必须做一个额外的步骤来避免关于 applicationContext.xml 在 web.xml 中执行以下操作的 FileNotFoundException
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/dispatcher-servlet.xml</param-value>
</context-param>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
【讨论】:
以上是关于ServletDispatcher 无法在我的 spring 项目中强制转换为 Javax.servlet.Servlet 异常的主要内容,如果未能解决你的问题,请参考以下文章
即使 .map 循环通过数组的所有索引,也无法在我的 React 应用程序中的 array.map 中显示我的 JSX 中的图像