对于HttpServletRequest类型,getDispatcherType()方法是未定义的



当我从Eclipse中运行我的应用程序时,它运行时没有任何servlet api 3.1.0和3.0.1的错误。

<dependency>
    <groupId>javax.servlet</groupId>
    <artifactId>javax.servlet-api</artifactId>
    <version>3.1.0</version>
</dependency>

我使用tomcat 8.0.21用于eclipse。我已经在ubuntu机器上安装了tomcat 8.0.14稳定版。

不幸的是,如果我使用servlet api 3.1.0,我得到以下错误消息。但它适用于旧版本3.0.1。

root cause
org.apache.jasper.JasperException: Unable to compile class for JSP: 
An error occurred at line: [50] in the generated java file: [/var/lib/tomcat8/work/Catalina/localhost/ROOT/org/apache/jsp/WEB_002dINF/view/templates/login_002dtemplate_jsp.java]
The method getDispatcherType() is undefined for the type HttpServletRequest
Stacktrace:
    org.apache.jasper.compiler.DefaultErrorHandler.javacError(DefaultErrorHandler.java:103)
    org.apache.jasper.compiler.ErrorDispatcher.javacError(ErrorDispatcher.java:199)
    org.apache.jasper.compiler.JDTCompiler.generateClass(JDTCompiler.java:450)
    org.apache.jasper.compiler.Compiler.compile(Compiler.java:361)
    org.apache.jasper.compiler.Compiler.compile(Compiler.java:336)
    org.apache.jasper.compiler.Compiler.compile(Compiler.java:323)
    org.apache.jasper.JspCompilationContext.compile(JspCompilationContext.java:564)
    org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:357)
    org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:396)
    org.apache.jasper.servlet.JspServlet.service(JspServlet.java:340)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:725)

为什么我得到这个错误?如何解决这个问题?

如果目标运行时已经提供了现成的API,你就不应该在提供web应用程序存档的同时提供Servlet API。Tomcat作为一个JSP/Servlet容器已经提供了现成的JSP、Servlet和EL api。当你把它们和你的web应用一起提供时,你可能会遇到类加载冲突,这是由来自web应用和服务器的运行时类路径中重复的不同版本的类引起的。

<scope>provided</scope>添加到目标运行时已经提供的依赖项中。

参见:

  • 如何导入javax. xml文件?我的Eclipse项目中的servlet API ?

对于Maven用户,这里有几个很好的答案,您可能想看看。

我仍然处于黑暗时代,并且没有为我的Tomcat项目使用依赖管理器。如果您像我一样遇到了这个问题,那么我是这样解决的:看起来tomcat提供了javax。Servlet类,因此这些不需要在项目的lib文件中。(我最初在/WEB-INF/lib目录中有servlet-api-2.5.jar。)但是,您可能仍然需要它来编译(我就是这样做的),因此您应该将它移动到java类路径中包含的位置。您可能还需要告诉IDE在哪里查找。

希望对你有帮助。

方法ServletRequest#getDispatcherType()从3.0版开始被引入Servlet规范。下面的错误意味着您在应用程序中使用的是javax.servlet-api的旧版本(例如,2.5)。

The method getDispatcherType() is undefined for the type HttpServletRequest

要解决这个问题,您可以执行以下两个步骤:

首先,将<scope>provided</scope>添加到依赖项javax.servlet-api

您应该将<scope>provided</scope>添加到依赖项中,因为Tomcat容器将在运行时提供该依赖项。同时,确保使用Tomcat 7或更高版本,它支持Servlet Spec 3.0或更高版本。

<dependency>
    <groupId>javax.servlet</groupId>
    <artifactId>javax.servlet-api</artifactId>
    <version>3.1.0</version>
    <scope>provided</scope>
</dependency>
第二,排除任何旧版本的javax.servlet-api

您需要确保javax.servlet-api的任何旧版本(例如2.5)不被传递地包含。您可以使用mvn dependency:tree来查找。请看下面的例子:

$ mvn dependency:tree
...
[INFO] +- com.google.oauth-client:google-oauth-client-servlet:jar:1.20.0:compile
[INFO] |  +- com.google.oauth-client:google-oauth-client:jar:1.20.0:compile     
[INFO] |  +- com.google.http-client:google-http-client-jdo:jar:1.20.0:compile   
[INFO] |  +- javax.servlet:servlet-api:jar:2.5:compile                          
[INFO] |  - javax.jdo:jdo2-api:jar:2.3-eb:compile                              
[INFO] |     - javax.transaction:transaction-api:jar:1.1:compile
...

在这种情况下,javax.servlet-api版本2.5是由一个名为google-oauth-client-servlet的依赖包含的。我们需要在pom.xml中排除它,如下所示:

<dependency>
    <groupId>com.google.oauth-client</groupId>
    <artifactId>google-oauth-client-servlet</artifactId>
    <version>1.20.0</version>
    <exclusions>
        <exclusion>
            <groupId>javax.servlet</groupId>
            <artifactId>servlet-api</artifactId>
        </exclusion>
    </exclusions>
</dependency>

相关内容

  • 没有找到相关文章

最新更新