【问题标题】:The method getDispatcherType() is undefined for the type HttpServletRequestHttpServletRequest 类型的方法 getDispatcherType() 未定义
【发布时间】:2015-10-15 15:29:20
【问题描述】:

当我从 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。我已经在运行tomcat 8.0.14稳定版的ubuntu机器上设置了tomcat8。

不幸的是,如果我使用 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)

为什么会出现此错误?如何解决这个问题?

【问题讨论】:

    标签: java maven servlets tomcat8 nosuchmethoderror


    【解决方案1】:

    如果目标运行时已经提供了开箱即用的 API,那么您不应该在提供 Web 应用程序存档的同时提供 Servlet API。作为 JSP/Servlet 容器的 Tomcat 已经提供了 JSP、Servlet 和 EL API。无论如何,当您将它们与您的 webapp 一起提供时,您可能会遇到由来自 webapp 和服务器的运行时类路径中重复的不同版本化类引起的类加载冲突。

    &lt;scope&gt;provided&lt;/scope&gt; 添加到目标运行时已经提供的那些依赖项中。

    另见:

    【讨论】:

    • 是否要确定所有冲突的 .jar 文件。 pom 文件有很多 .jar 文件。
    • 从Java EE API来看,Tomcat只提供了JSP、Servlet和EL。其余部分(例如 JSF、JSTL、CDI 等)您必须通过 web 应用程序自己提供。
    • 您的回答为我工作,但我不得不手动删除 servlet-api-2.5-20081211.jar。你知道它包含这个jar的哪个pom文件配置吗?
    • 没有看到 pom 就很难分辨。
    【解决方案2】:

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

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

    希望对您有所帮助。

    【讨论】:

      【解决方案3】:

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

      The method getDispatcherType() is undefined for the type HttpServletRequest
      

      要解决此问题,您可以按照以下两个步骤进行:

      首先,将&lt;scope&gt;provided&lt;/scope&gt;添加到依赖javax.servlet-api

      您应该将&lt;scope&gt;provided&lt;/scope&gt; 添加到依赖项中,因为您的 Tomcat 容器将在运行时提供该依赖项。同时,请确保您使用的是支持 Servlet Spec 3.0 或更高版本的Tomcat 7 or higher

      <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>
      

      就是这样。

      【讨论】:

        猜你喜欢
        • 2015-02-12
        • 2014-12-13
        • 2015-04-23
        • 1970-01-01
        • 2017-05-10
        • 1970-01-01
        • 1970-01-01
        • 2022-12-23
        相关资源
        最近更新 更多