Soit je suis à côté de mes pompes, ou alors ce n'est pas évident pour moi.
Quoi qu'il en soit pourriez-vous m'indiquer pour quelle raison ma dernière condition if ( avec le submit ) est valide ( vu que mon log m'affiche mon okidokido ) si je me prends une belle nullpointerException ??? je précise que la ligne 149 correspond à la ligne du if avec le submit.
Surtout qu'avec firebug, je vois aussi mon paramètre submit valant addPatient.
Je vous remercie d'avance pour vos lumières ^^
juil. 05, 2016 6:01:55 PM org.apache.catalina.core.StandardWrapperValve invoke GRAVE: "Servlet.service()" pour la servlet be.gestisoins.controllers.PatientManagement a généré une exception java.lang.NullPointerException at be.gestisoins.controllers.PatientManagement.doPost(PatientManagement.java:149) at javax.servlet.http.HttpServlet.service(HttpServlet.java:650) at javax.servlet.http.HttpServlet.service(HttpServlet.java:731) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:303) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208) at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208) at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:220) at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:122) at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:505) at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:169) at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:103) at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:956) at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:116) at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:423) at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1079) at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:625) at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:318) at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source) at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source) at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) at java.lang.Thread.run(Unknown Source)
2016-07-05 18:01:57:822 INFO be.gestisoins.controllers.PatientManagement: okidokido!
Mon bout de code de servlet ( le log est un log4j )
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
{
//**************************************************//
// Récupération de data pour le select2 //
//**************************************************//
if ( request.getParameterMap().containsKey("info") &&
request.getParameter("info").equals("cityLookup") &&
request.getParameterMap().containsKey("cityLookup") &&
request.getParameter("cityLookup").matches("[\\w]{2,100}")
)
{
// Test si le champ est valide
if(request.getParameter("cityLookup").matches("[\\w]{2,100}"))
{
city = request.getParameter("cityLookup");
EntityFinder<Location> ef = new EntityFinderImpl<>();
List<Location> loc;
Map<String, Object> map = new HashMap<>();
map.put("city", city);
// Requête afin de trouver les records
loc = ef.findByNamedQuery("Location.findWithWildCard", new Location(), map);
log.info("Recherche de la localité");
// Garnissage d'un tableau JSON avec des JSONObjects
JSONObject json = new JSONObject();
JSONArray location = new JSONArray();
JSONObject obj;
try
{
for(Location l : loc)
{
obj = new JSONObject();
obj.put("id", l.getIdLocation());
obj.put("city", l.getCity());
obj.put("zipCode", l.getZipCode());
location.put(obj);
}
json.put("location", location);
}
catch (JSONException e)
{
log.debug(e);
}
// Set du type de contenu pour la réponse
response.setContentType("application/json");
// Writer
//response.getWriter().write(json);
PrintWriter out = response.getWriter();
out.print(json);
out.flush();
}
}
if(request.getParameter("submit").equals("active"))
{
log.info("okidokido!");
}
else log.error("Erreur lors de la recherche de ville");
}
}
KX
Messages postés16727Date d'inscriptionsamedi 31 mai 2008StatutModérateurDernière intervention 2 décembre 2023126 6 juil. 2016 à 00:21
Bonjour,
Si je simplifie ta question tu as :
if (request.getParameter("submit").equals("active")) // ligne 149
{
log.info("okidokido!");
}
Qui te donne :
juil. 05, 2016 6:01:55 PM org.apache.catalina.core.StandardWrapperValve invoke
GRAVE: "Servlet.service()" pour la servlet be.gestisoins.controllers.PatientManagement a généré une exception
java.lang.NullPointerException
at be.gestisoins.controllers.PatientManagement.doPost(PatientManagement.java:149)
2016-07-05 18:01:57:822 INFO be.gestisoins.controllers.PatientManagement: okidokido!
Tu ne comprends comment tu peux avoir une Exception et un okidokido en même temps.
La réponse est simple, ces deux logs ont deux secondes d'écart (6:01:55 PM et 18:01:57:822), c'est trop long pour être deux lignes de codes qui se suivent. Par contre c'est un temps correct entre deux essais successifs de la même requête, la première qui plante, la seconde qui réussit.
Si tu modifies par exemple comme ceci :
log.info("Je suis avant");
if (request.getParameter("submit").equals("active"))
Tu obtiendras alors des logs comme ceci (avec deux fois "Je suis avant")
01:55 Je suis avant
01:55 NullPointerException
01:57 Je suis avant
01:57 okidokido
Sinon pour résoudre ton NPE tu peux simplement inverser la condition :
if ("active".equals(request.getParameter("submit")))
J'avais tellement le nez dessus que je ne le voyais pas...
En fait je passe 2 fois dans cette servlet, une fois arrivé sur la page et une fois lors de la validation du formulaire.
Comme j'ai oublié de tester si le paramètre existe, et bien en arrivant sur la page je me prends cette NPE. Ensuite le test réussi car le paramètre existe quand mon formulaire est validé.