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

时间:2015-07-24 20:33:41

标签: java maven servlets tomcat8 nosuchmethoderror

当我从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机器上设置了tomcat8,它运行在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)

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

3 个答案:

答案 0 :(得分:4)

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

if添加到目标运行时已提供的依赖项中。

另见:

答案 1 :(得分:2)

对于Maven用户,您可能需要查看几个好的答案here

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

希望有所帮助。

答案 2 :(得分:0)

方法ServletRequest#getDispatcherType()自3.0版以来就引入了Servlet Spec。以下错误表示您在应用程序中使用的是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 or higher支持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的依赖项可传递地包含google-oauth-client-servlet 2.5版。我们需要将其排除在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>

就是这样。