El método getDispatcherType () no está definido para el tipo HttpServletRequest

Cuando ejecuto mi aplicación desde Eclipse, se ejecuta sin errores para servlet api 3.1.0 y 3.0.1.

 javax.servlet javax.servlet-api 3.1.0  

Yo uso Tomcat 8.0.21 para eclipse. He configurado tomcat8 en la máquina ubuntu que se ejecuta en la versión estable de tomcat 8.0.14.

Desafortunadamente, recibo el siguiente mensaje de error si uso servlet api 3.1.0. Pero funciona para la versión anterior 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.JspComstacktionContext.compile(JspComstacktionContext.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) 

¿Por qué obtengo este error? ¿Cómo arreglar esto?

Se supone que no debes proporcionar la API de Servlet junto con el archivo de la aplicación web si el tiempo de ejecución de destino ya proporciona la API fuera de la caja. Tomcat como JSP / Servletcontainer ya proporciona JSP, Servlet y EL APIs fuera de la caja. Cuando los proporciona junto con su aplicación web de todos modos, puede encontrarse con conflictos de carga de clases causados ​​por clases duplicadas de versiones diferentes en el classpath en tiempo de ejecución que proviene tanto de la aplicación web como del servidor.

Agregue provided a las dependencias ya proporcionadas por el tiempo de ejecución de destino.

Ver también:

  • ¿Cómo importo la API javax.servlet en mi proyecto Eclipse?

Para los usuarios de Maven, hay varias buenas respuestas aquí que quizás desee verificar.

Todavía estoy en la edad media y no estoy usando un administrador de dependencias para mi proyecto Tomcat. Si eres como yo y tienes este problema, así es como lo resolví: parece que tomcat proporciona las clases javax.servlet, por lo que no es necesario que estén en el archivo lib de tu proyecto. (Originalmente tenía el servlet-api-2.5.jar en mi directorio /WEB-INF/lib ). Sin embargo, probablemente aún lo necesite para comstackr (lo hice), por lo que debería moverlo a una ubicación incluida en su java classpath. También es posible que necesite decirle a su IDE dónde buscar.

Espero que ayude.

El método ServletRequest#getDispatcherType() se introdujo en la especificación del servlet desde la versión 3.0. El siguiente error significa que está utilizando una versión anterior (por ejemplo, 2.5) de javax.servlet-api en su aplicación.

 The method getDispatcherType() is undefined for the type HttpServletRequest 

Para resolver este problema, puede seguir los dos pasos siguientes:

En primer lugar, agregue provided a la dependencia javax.servlet-api

Debe agregar provided a la dependencia, ya que su contenedor Tomcat proporcionará la dependencia en tiempo de ejecución. Y al mismo tiempo, asegúrese de estar utilizando Tomcat 7 o una versión superior , que sea compatible con Servlet Spec 3.0 o superior.

  javax.servlet javax.servlet-api 3.1.0 provided  

En segundo lugar, excluya cualquier versión anterior de javax.servlet-api

Debe asegurarse de que cualquier versión anterior (por ejemplo, 2.5) de javax.servlet-api no se incluya transitivamente. Puede usar la mvn dependency:tree para averiguarlo. Vea abajo un ejemplo:

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

En este caso, javax.servlet-api versión 2.5 se incluye transitoriamente por una dependencia llamada google-oauth-client-servlet . Necesitamos excluirlo en pom.xml, como a continuación:

  com.google.oauth-client google-oauth-client-servlet 1.20.0   javax.servlet servlet-api    

Eso es.