Pourquoi Servlet?service() de la servlet jsp lever cette exception?
j'obtiens l'erreur suivante, ce qui pourrait être le problème?
Mon descripteur de contexte:
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5">
<servlet>
<servlet-name>UploadServlet</servlet-name>
<servlet-class>controller.UploadServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>UploadServlet</servlet-name>
<url-pattern>/UploadServlet</url-pattern>
</servlet-mapping>
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
</web-app>
SEVERE: Servlet.service() for servlet jsp threw exception
java.lang.NullPointerException
at org.apache.jsp.index_jsp._jspInit(index_jsp.java:22)
at org.apache.jasper.runtime.HttpJspBase.init(HttpJspBase.java:52)
at org.apache.jasper.servlet.JspServletWrapper.getServlet(JspServletWrapper.java:159)
at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:329)
at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:342)
at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:267)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:128)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:293)
at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:849)
at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:583)
at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:454)
at java.lang.Thread.run(Unknown Source)
Feb 23, 2010 11:35:28 PM org.apache.catalina.core.StandardWrapperValve invoke
SEVERE: Servlet.service() for servlet jsp threw exception
java.lang.NullPointerException
at org.apache.jsp.index_jsp._jspInit(index_jsp.java:22)
at org.apache.jasper.runtime.HttpJspBase.init(HttpJspBase.java:52)
at org.apache.jasper.servlet.JspServletWrapper.getServlet(JspServletWrapper.java:159)
at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:329)
at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:342)
at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:267)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:128)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:293)
at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:849)
at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:583)
at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:454)
at java.lang.Thread.run(Unknown Source)
5 réponses
il peut être causé par une contamination de classepath. Vérifiez que vous /WEB-INF/lib
ne contient pas quelque chose comme jsp-api-*.jar
.
si votre projet est basé sur Maven, n'oubliez pas de définir scope à provided pour des dépendances telles que servlet-api, JSP-api. Sinon, ces bocaux seront exportés vers WEB-INF / lib et donc contamineront ceux du serveur Tomcat. Qui provoque des problèmes douloureux.
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>servlet-api</artifactId>
<version>2.5</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>javax.servlet.jsp</groupId>
<artifactId>jsp-api</artifactId>
<version>2.1</version>
<scope>provided</scope>
</dependency>
j'ai eu cette erreur; c'est arrivé un peu spontanément, et la page s'arrêtait dans le navigateur au milieu d'une balise HTML (pas une section de code). Il est déconcertant!
Pour donner un exemple plus concret... À l'intérieur d'une méthode, j'avais quelque chose comme:
Foo[] foos = new Foo[20];
// fill up the "foos" array...
return Arrays.asList(foos); // this returns type List<Foo>
maintenant dans ma page JSP, j'ai appelé cette méthode et utilisé L'objet List retourné par elle. L'objet List est soutenu par ce tableau "foos"; mais, le tableau est sorti de la portée quand je suis revenu de la méthode (puisqu'il s'agit d'une variable locale). Ainsi, peu de temps après son retour, le collecteur d'ordures a balayé le tableau "foos", et mon accès à la liste a causé une NullPointerException puisque son tableau sous-jacent a été maintenant effacé.
en fait, je me suis demandé, comme j'ai écrit la méthode ci-dessus, si cela se produirait.
encore plus profond problème sous-jacent est l'optimisation prématurée. Je voulais une liste, mais je savais que j'aurais exactement 20 éléments, donc je me suis dit que j'essaierais d'être plus efficace que new ArrayList<Foo>(20)
qui n'établit une taille initiale de 20, mais peut éventuellement être moins efficace que la méthode que j'ai utilisé. Donc bien sûr, pour le réparer, j'ai créé mon tableau, je l'ai rempli et je l'ai retourné. Pas plus étrange erreur.
le problème est dans votre JSP, très probablement vous appelez une méthode sur un objet qui est null à l'exécution.
cela se produit dans l'appel _jspInit (), ce qui est un peu plus inhabituel... le code de problème est probablement une déclaration de méthode comme <%! %>
mise à jour: j'ai seulement reproduit ceci en remplaçant la méthode _jspInit (). Est-ce que vous êtes en train de faire? Si oui, il n'est pas recommandé - c'est pourquoi il commence par un _.
j'ai essayé de mon mieux pour suivre les réponses données ci-dessus. Mais j'ai une raison INFRA pour la même.
Note: Ceci est pour le déploiement maven+eclipse+tomcat et le problème rencontré en particulier avec MVC printemps.
1-Si vous incluez les dépendances servlet et jsp, veuillez les marquer dans scope.
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.1.0</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>javax.servlet.jsp</groupId>
<artifactId>javax.servlet.jsp-api</artifactId>
<version>2.3.1</version>
<scope>provided</scope>
</dependency>
peut-être que vous incluez jstl comme dépendance. Donc,
jsp-api.jar
etservlet-api.jar
va être inclus. Donc, besoin d' exclure le servlet-api et le jsp-api déployés selon les besoins lib dans target ou dans "WEB-INF / lib" comme indiqué ci-dessous.<dependency> <groupId>javax.servlet.jsp.jstl</groupId> <artifactId>jstl-api</artifactId> <version>1.2</version> <exclusions> <exclusion> <artifactId>servlet-api</artifactId> <groupId>javax.servlet</groupId> </exclusion> <exclusion> <artifactId>jsp-api</artifactId> <groupId>javax.servlet.jsp</groupId> </exclusion> </exclusions> </dependency>