La méthode getDispatcherType () n'est pas définie pour le type HttpServletRequest

quand J'exécute mon applicaiton à partir D'Eclipse, il s'exécute sans aucune erreur pour les api servlet 3.1.0 et 3.0.1.

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

j'utilise tomcat 8.0.21 Pour eclipse. J'ai mis en place tomcat8 sur ubuntu machine qui tourne sur tomcat 8.0.14 version stable.

Malheureusement, je reçois le message d'erreur suivant si j'utilise l'api servlet 3.1.0. Mais cela fonctionne pour l'ancienne version 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)

pourquoi cette erreur? Comment réparer cette?

2
demandé sur BalusC 2015-07-24 23:33:41

3 réponses

vous n'êtes pas censé fournir L'API de Servlet en même temps que l'archive de l'application web si l'exécution cible fournit déjà l'API dans la boîte. Tomcat as étant un JSP / Servletcontainer fournit déjà JSP, Servlet et El APIs sur la boîte. Lorsque vous les fournissez avec votre webapp de toute façon, alors vous pouvez vous lancer dans des conflits de chargement de classe causés par dupliquer différentes classes suivies en versions dans le chemin de classe runtime provenant à la fois de la webapp et du serveur.

ajouter <scope>provided</scope> aux dépendances déjà fournies par l'exécution cible.

voir aussi:

4
répondu BalusC 2017-05-23 11:54:09

pour les utilisateurs de Maven il y a plusieurs bonnes réponses ici que vous pourriez vouloir vérifier.

je suis encore à l'âge des ténèbres, et je n'utilise pas de gestionnaire de dépendances pour mon projet Tomcat. Si vous êtes comme moi et avez ce problème, Voici comment je l'ai résolu: il semble que tomcat fournit le javax.les classes servlet, donc ces ne sont pas doivent être dans le fichier lib de votre projet. (J'ai eu à l'origine le servlet-api-2.5.jar dans mon /WEB-INF/lib répertoire.) Cependant, vous en aurez probablement encore besoin pour compiler (Je l'ai fait), donc vous devriez le déplacer vers un emplacement inclus dans votre classpath java. Vous pourriez aussi avoir besoin de dire à votre IDE où chercher.

Espère que ça aide.

2
répondu OneWholeBurrito 2017-05-23 12:02:00

Méthode ServletRequest#getDispatcherType() a été introduit à la Servlet Spec depuis la version 3.0. L'erreur suivante signifie que vous utilisez une version plus ancienne (par exemple, 2.5) de javax.servlet-api dans votre application.

The method getDispatcherType() is undefined for the type HttpServletRequest

pour résoudre ce problème, vous pouvez suivre les deux étapes suivantes:

tout d'abord, ajouter <scope>provided</scope> à la dépendance javax.servlet-api

vous devez ajouter <scope>provided</scope> à la dépendance, parce que votre Tomcat container fournira la dépendance à l'exécution. Et en même temps, assurez-vous que vous utilisez Tomcat 7 ou supérieur , qui supporte Servlet Spec 3.0 ou supérieur.

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

deuxièmement, exclure toute version plus ancienne de javax.servlet-api

vous devez vous assurer que toute version plus ancienne (par exemple, 2.5) de javax.servlet-api n'est pas incluse de façon transitoire. Vous pouvez utiliser mvn dependency:tree pour le savoir. Voir ci-dessous un exemple:

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

dans ce cas, la version 2.5 de javax.servlet-api est incluse de façon transitoire par une dépendance appelée google-oauth-client-servlet . Nous devons l'exclure de pom.xml, comme ci-dessous:

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

C'est ça.

0
répondu Yuci 2018-08-01 12:57:16