InvocationTargetException dans un servlet.

InvocationTargetException dans un servlet. - Java - Programmation

Marsh Posté le 19-07-2006 à 09:49:34    

Bonjour, je suis en train de développer une application Web en JAVA. Dans mon servlet, j'utilise une classe UsinePriorite censée me créer, au moyen de la méthode create(String), un objet implémentant l'interface PrioriteIfc. La méthode create(String) a été testée et fonctionne (argument null ou non).
 
Le problème, c'est que lorsque j'appelle mon servlet depuis le navigateur, il me lance une InvocationTargetException lorsqu'il essaie de lancer la fonction create, pourtant, je lui pas bien un objet de classe String. Si quelqu'un avait une idée de pourquoi ça me lance cette exception, je suis preneur ... Voici le code source de ma servlet (en tout cas des parties utiles ...) :
 
La partie initialisation ...

Code :
  1. public class ServletHelpdesk extends HttpServlet{
  2. // Attributs
  3. private Connection con;
  4. private UsinePrioriteIfc usnPrio;
  5. public void init(){
  6. try {
  7.  // On initialise le driver, puis on récupère la connexion  
  8.  Class.forName("net.sourceforge.jtds.jdbc.Driver" );
  9.  Connection con=DriverManager.getConnection("jdbc:jtds:sqlserver://localhost","esclauger","esclauger" );
  10.  // On initialise toutes les usines
  11.  this.usnPrio=new UsinePriorite(this.con);
  12. } catch (ClassNotFoundException e) {
  13.  this.destroy();
  14. } catch (SQLException e){
  15.  this.destroy();
  16. }
  17. }


 
et là ou est appelée la fonction (la méthode est public pour des raisons de j'avais pas envie de me casser les c**** car elle est invoquée grace à un système utilisant la reflexivité...

Code :
  1. public void ajtPrio(HttpServletRequest req, HttpServletResponse rep) throws ServletException{
  2.  String desc = req.getParameter("description" );
  3.  if (desc != null) {
  4.   try {
  5.    System.out.println("Creation d'une priorité" );
  6.    PrioriteIfc p = this.usnPrio.create("Urgent" );
  7.    System.out.println(p);
  8.    req.setAttribute("created",p);
  9.    System.out.println("Ca va charger le JSP" );
  10.    this.getServletContext().getRequestDispatcher("/views/ajtPrioSucces.jsp" ).forward(req,rep);
  11.   }
  12. ...


La méthode ajtPrio se lance bien comme il faut depuis doGet et doPost quand il n'y a pas de paramètre "description" dans la requête, mais dès que celui ci est présent, ça plante à la ligne "PrioriteIfc p = this.usnPrio.create("Urgent" );".

Reply

Marsh Posté le 19-07-2006 à 09:49:34   

Reply

Marsh Posté le 19-07-2006 à 09:58:07    

stackTrace ?


---------------
HFR - Mes sujets pour Chrome - Firefox - vérifie les nouveaux posts des topics suivis/favoris
Reply

Marsh Posté le 19-07-2006 à 10:16:18    

En fait le log me coupait une partie de la stack trace (je changeait les types d'exceptions en les faisant remonter). Quand je fais un printStackTrace dans la servlet, j'obtiens  

Code :
  1. java.lang.NullPointerException
  2. at presentation.ServletHelpdesk.ajtPrio(ServletHelpdesk.java:86)
  3. at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
  4. at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
  5. at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
  6. at java.lang.reflect.Method.invoke(Method.java:324)
  7. at presentation.ServletHelpdesk.doGet(ServletHelpdesk.java:136)
  8. at presentation.ServletHelpdesk.doPost(ServletHelpdesk.java:162)
  9. at javax.servlet.http.HttpServlet.service(HttpServlet.java:709)
  10. at javax.servlet.http.HttpServlet.service(HttpServlet.java:802)
  11. at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:237)
  12. at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:157)
  13. at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:214)
  14. at org.apache.catalina.core.StandardValveContext.invokeNext(StandardValveContext.java:104)
  15. at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:520)
  16. at org.apache.catalina.core.StandardContextValve.invokeInternal(StandardContextValve.java:198)
  17. at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:152)
  18. at org.apache.catalina.core.StandardValveContext.invokeNext(StandardValveContext.java:104)
  19. at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:520)
  20. at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:137)
  21. at org.apache.catalina.core.StandardValveContext.invokeNext(StandardValveContext.java:104)
  22. at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:118)
  23. at org.apache.catalina.core.StandardValveContext.invokeNext(StandardValveContext.java:102)
  24. at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:520)
  25. at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
  26. at org.apache.catalina.core.StandardValveContext.invokeNext(StandardValveContext.java:104)
  27. at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:520)
  28. at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:929)
  29. at org.apache.coyote.tomcat5.CoyoteAdapter.service(CoyoteAdapter.java:160)
  30. at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:799)
  31. at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.processConnection(Http11Protocol.java:705)
  32. at org.apache.tomcat.util.net.TcpWorkerThread.runIt(PoolTcpEndpoint.java:577)
  33. at org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:683)
  34. at java.lang.Thread.run(Thread.java:534)


 
En gros si je comprend bien, il me dit que mon objet usnPrio est null, c'est ça ?
 
[edit] Et c'est bien ça, je teste juste avant si this.usnPrio est null et il l'est ... comment ce fesse ? je croyais l'avoir initialisé dans ma fonction init(), et ce définitivement ...[/edit]


Message édité par Titelf le 19-07-2006 à 10:20:50
Reply

Marsh Posté le 19-07-2006 à 10:31:28    

c'est un peu dégueux ton archi, soit dit sans t'offenser...
 
regarde du coté du MVC, et améliore tout ça...
 
sinon, pour ton init, essaye de changer la signature, ça mange pas de pain, même si je doute que ça soit utile :

Code :
  1. public void init() throws ServletException {


 
es-tu sûr de passer dedant ? (ça serai étrange que non)


---------------
HFR - Mes sujets pour Chrome - Firefox - vérifie les nouveaux posts des topics suivis/favoris
Reply

Marsh Posté le 19-07-2006 à 10:46:37    

Pour l'archi, je conçoit que ça a l'air un peu laid comme ça, mais je croyais faire du MVC ... la servlet effectue les actions, puis passe les données aux vues (en JSP) en modifiant un modèle (request) ...  
 
Sinon au niveau du init, j'y ai collé un System.out.println dedans (je dois donc trouver ce que je souhaite écrire dans sdout.txt dans le répertoir log de tomcat ...) et ça n'affiche rien ... si tu as une autre solution pour me permettre de vérifier que la fonction init est bien lancée, je suis preneur ...

Reply

Marsh Posté le 19-07-2006 à 10:49:23    

Citation :

Pour l'archi, je conçoit que ça a l'air un peu laid comme ça, mais je croyais faire du MVC ... la servlet effectue les actions, puis passe les données aux vues (en JSP) en modifiant un modèle (request) ...  

désolé, mais lol :)
 
tu as déclaré ta servlet dans web.xml ?


---------------
HFR - Mes sujets pour Chrome - Firefox - vérifie les nouveaux posts des topics suivis/favoris
Reply

Marsh Posté le 19-07-2006 à 10:57:08    

ouaip, elle est bien déclarée dans web.xml ...
 
Sinon, pourquoi lol ?

Reply

Marsh Posté le 19-07-2006 à 11:01:09    

devine


---------------
HFR - Mes sujets pour Chrome - Firefox - vérifie les nouveaux posts des topics suivis/favoris
Reply

Marsh Posté le 19-07-2006 à 11:11:29    

Okay, j'avais lu des trucs sur MVC, mais j'avais mal compris apparament ... sinon, une idée de pourquoi c'est null (ou de comment je peux voir si je passe dans l'init ou pas ...)

Reply

Marsh Posté le 19-07-2006 à 11:14:22    

met pas de variable dans ta servlet, et plus de problème :)
 
au pire, fait la transiter dans la request, pour tester, parce que c'est dégueux hien.


---------------
HFR - Mes sujets pour Chrome - Firefox - vérifie les nouveaux posts des topics suivis/favoris
Reply

Marsh Posté le 19-07-2006 à 11:14:22   

Reply

Marsh Posté le 19-07-2006 à 22:16:49    

ouais ca merde forcement au niveau de l'init car ton objet usnPrio est null ... T'as une stacktrace quand tu démarres ton conteneur ? ya pas moyen que tu cales un breakpoint dans init ?  
 

Reply

Marsh Posté le 20-07-2006 à 00:24:56    

brisssou a écrit :

Citation :

Pour l'archi, je conçoit que ça a l'air un peu laid comme ça, mais je croyais faire du MVC ... la servlet effectue les actions, puis passe les données aux vues (en JSP) en modifiant un modèle (request) ...  

désolé, mais lol :)


l'mportant pour des applis web c'est de séparer la vue du modèle-controlleur. c'est ce qu'il fait, et c'est déjà pas mal ...
 

Titelf a écrit :

Okay, j'avais lu des trucs sur MVC, mais j'avais mal compris apparament ... sinon, une idée de pourquoi c'est null (ou de comment je peux voir si je passe dans l'init ou pas ...)


non.
c'est surement que tu lui affecte la valeur null ailleur dans ta servlet. ou bien que tu as également une méthode ini avec en argument un ServletContext (dans ce cas, c'est celle là qui sera appelée, et pas la init sans argument)

Reply

Marsh Posté le 20-07-2006 à 07:59:32    

c'est le fait d'appeller Model la request http, ça me semblait un peu exagéré.


---------------
HFR - Mes sujets pour Chrome - Firefox - vérifie les nouveaux posts des topics suivis/favoris
Reply

Marsh Posté le 20-07-2006 à 08:20:30    

@sebi2706> J'ai été voir dans les divers fichiers de logs du serveur Tomcat, a part "Rechargement de ce contexte", j'ai pas grand chose qui m'indique qu'il initialise mon conteneur. J'ai essayé de mettre des println() dans le init, mais ça veut pas marcher. Pour ce qui est des breakpoints, tu pensais à quoi ?
 
J'ai finalement fini par ne plus mettre de variables dans ma servlet, mais ça me fait un peu ch*** d'initialiser une connexion à la base de données chaque fois que je lance une fonction, je pensais pouvoir le faire une fois pour toute (voire gérer un pool de connexion pour être plus efficace)...

Reply

Marsh Posté le 20-07-2006 à 08:23:06    

pour les breakpoints, il pensait juste à en mettre je crois  :)  Dans le init, ça semble judicieux, puisque c'est là qu'on est pas sûr de passer...

 

edit : le reste du message, c'était de la merde...

Message cité 1 fois
Message édité par brisssou le 20-07-2006 à 08:53:30

---------------
HFR - Mes sujets pour Chrome - Firefox - vérifie les nouveaux posts des topics suivis/favoris
Reply

Marsh Posté le 20-07-2006 à 08:47:34    

brisssou a écrit :


Et même si tu gères un pool de connexions, je crois pas dire de conneries en disant que la connexion sera fermée à chaque fin de requête à la servlet... si ?


ben si. c'est le but d'un pool de connection de garder des connections ouvertes ...


Message édité par benou le 20-07-2006 à 08:48:07
Reply

Marsh Posté le 20-07-2006 à 08:49:37    

en le disant j'me suis rendu compte que je disais une connerie


---------------
HFR - Mes sujets pour Chrome - Firefox - vérifie les nouveaux posts des topics suivis/favoris
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed