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?
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:
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.
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.