Partage
  • Partager sur Facebook
  • Partager sur Twitter

Null Pointer Exception

Sujet résolu
    17 novembre 2014 à 11:02:41

    Bonjour à tous,

    Je suis à l'étape 6 du TP fil rouge et je bloque sur un truc depuis un moment: la création d'une commande en base de données ne fonctionne pas, alors que celle d'un client fonctionne parfaitement.

    Lors de la création d'une commande, j'ai une erreur 500: Le serveur a rencontré une erreur interne qui l'a empêché de satisfaire la requête.

    Voici le rapport d'erreur: 

    Grave: "Servlet.service()" pour la servlet CreationCommande a généré une exception

    java.lang.NullPointerException

    at com.gaetan.tp.forms.CommandeForm.creerCommande(CommandeForm.java:117)

    at com.gaetan.tp.servlets.CreationCommande.doPost(CreationCommande.java:40)

    at javax.servlet.http.HttpServlet.service(HttpServlet.java:644)

    at javax.servlet.http.HttpServlet.service(HttpServlet.java:725)

    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:291)

    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)

    at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)

    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:239)

    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)

    at org.apache.catalina.filters.SetCharacterEncodingFilter.doFilter(SetCharacterEncodingFilter.java:108)

    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:239)

    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)

    at com.gaetan.tp.filters.PrechargementFilter.doFilter(PrechargementFilter.java:68)

    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:239)

    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)

    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:219)

    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:106)

    at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:506)

    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:142)

    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:79)

    at org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:610)

    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:88)

    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:537)

    at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1081)

    at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:658)

    at org.apache.coyote.http11.Http11NioProtocol$Http11ConnectionHandler.process(Http11NioProtocol.java:222)

    at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1566)

    at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.run(NioEndpoint.java:1523)

    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)

    Et voici les fragments de code concernés:

    CreationCommande.java:

    1
    2
    3
    4
    5
    public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException{
    CommandeForm form = new CommandeForm(commandeDao, clientDao);
    Commande commande = form.creerCommande(request); //ligne 40
    request.setAttribute(ATTR_COMMANDE, commande);
    request.setAttribute(ATTR_FORM, form);


    CommandeForm.java:

    1
    2
    3
    if(erreurs.isEmpty()){
    resultat = "Commande créée avec succès !";
    commandeDao.creer(commande); //ligne 117<br>}

    Méthode creer dans ma classe CommandeDaoImpl:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    public void creer(Commande commande) throws DAOException{
    Connection connexion = null;
    PreparedStatement preparedStatement = null;
    ResultSet valeursAutoGenerees = null;
    try{
    //recuperation d'une connexion depuis la factory
    connexion = daoFactory.getConnection();
    preparedStatement = initialisationRequetePreparee(connexion, SQL_INSERT, true, commande.getClient().getId(),
    new DateTime(commande.getDate().getMillis()),
    commande.getMontant(), commande.getModeLivraison(), commande.getStatutLivraison(), commande.getModePaiement(),
    commande.getStatutPaiement());
    int statut = preparedStatement.executeUpdate();
    if(statut == 0){
    throw new DAOException("Échec de la création de la commande, aucune ligne ajoutée dans la table");
    }
    valeursAutoGenerees = preparedStatement.getGeneratedKeys();
    if ( valeursAutoGenerees.next() ) {
    // Puis initialisation de la propriété id du bean Utilisateur avec sa valeur
    commande.setId( valeursAutoGenerees.getLong( 1 ) );
    else {
    throw new DAOException( "Échec de la création de la commande en base, aucun ID auto-généré retourné." );
    }
    }
    catch(SQLException e){
    throw new DAOException(e);
    }
    finally{
    fermeturesSilencieuses( valeursAutoGenerees, preparedStatement, connexion );
    }
    }

    J'ai bien vérifié la syntaxe de la requête, le nom des champs dans ma table etc... mais rien à faire, j'ai toujours la même erreur. Et le plus étrange, c'est que j'ai la partie création d'un client qui repose sur le même principe sauf que la ca fonctionne nickel ^^

    Si quelqu'un a déjà rencontré ce problème ou est susceptible de m'aider, c'est avec plaisir :) Merci

    • Partager sur Facebook
    • Partager sur Twitter
      17 novembre 2014 à 13:49:25

      Avec le peu de code que tu nous fournis (Tout le contenu de la méthode CommandeForm.creerCommand() n'aurait pas été du luxe), je dirais que l'objet commandeDao est nul.
      • Partager sur Facebook
      • Partager sur Twitter
        17 novembre 2014 à 14:08:50

        Pardon, j'avais peur de surcharger le message et que ca en soit incompréhensible.

        Voici le code de ma méthode creerCommande()

        public Commande creerCommande(HttpServletRequest request){
        		Client client;
        		/**
        		 * Si le client choisi est deja dans la liste, pas besoin de faire les verifs
        		 */
        		String choixNouveauClient = getValeurChamp(request, CHAMP_CHOIX_CLIENT);
        		if(ANCIEN_CLIENT.equals(choixNouveauClient)){
        			//Récupération de l'id du client choisi
        			String idAncienClient = getValeurChamp(request, CHAMP_LISTE_CLIENTS);
        			Long id = null;
        			try{
        				id = Long.parseLong(idAncienClient);
        			}
        			catch(NumberFormatException e){
        				setErreur(CHAMP_CHOIX_CLIENT, "Client inconnu, veuillez le créer grâce au formulaire prévu à cet effet.");
        				id = 0L;
        			}
        			HttpSession session = request.getSession();
        			client = ( (Map<Long, Client>) session.getAttribute( SESSION_CLIENTS ) ).get(id);
        		}
        		else{
        			/**
        			 * On valide les données client et on récupère les éventuelles erreurs
        			 */
        			ClientForm clientForm = new ClientForm(clientDao);
        			client = clientForm.creerClient(request);
        			erreurs = clientForm.getErreurs();
        		}
        		
        		/**
        		 * Création de l'objet date
        		 */
        		DateTime dt = new DateTime();
        		
        		/**
        		 * On récupère les valeurs des champs
        		 */
        		String montant = getValeurChamp(request, CHAMP_MONTANT);
        		String modePaiement = getValeurChamp(request, CHAMP_MODE_PAIEMENT);
        		String statutPaiement = getValeurChamp(request, CHAMP_STATUT_PAIEMENT);
        		String modeLivraison = getValeurChamp(request, CHAMP_MODE_LIVRAISON);
        		String statutLivraison = getValeurChamp(request, CHAMP_STATUT_LIVRAISON);
        		String dateLivraison = getValeurChamp(request, CHAMP_DATE);
        		
        		/**
        		 * On créé un bean commande
        		 */
        		Commande commande = new Commande();
        		
        		traiterClient(client, commande);
        		commande.setDate(dt);
        		traiterMontant(montant, commande);
        		traiterModeLivraison(modeLivraison, commande);
        		traiterStatutLivraison(statutLivraison, commande);
        		traiterModePaiement(modePaiement, commande);
        		traiterStatutPaiement(statutPaiement, commande);
        			
        		try{
        			if(erreurs.isEmpty()){
        				resultat = "Commande créée avec succès !";
        				commandeDao.creer(commande);
        			}
        		else{
        			resultat = "Impossible de créer la commande.";
        		}
        			
        		}catch(DAOException e){
        			resultat = "Impossible de créer la commande, une erreur imprévue est survenue.";
        			setErreur("imprévu", "Erreur imprévue lors de la création");
        			e.printStackTrace();
        		}
        		return commande;
        	}



        • Partager sur Facebook
        • Partager sur Twitter
          17 novembre 2014 à 14:37:29

          Est-ce que commandeDao est nul?
          • Partager sur Facebook
          • Partager sur Twitter
            17 novembre 2014 à 15:14:22

            Oui, il est déclaré en paramètre de ma classe, mais ce qui est étrange c'est que j'utilise ce fonctionnement pour une autre partie de mon appli et je n'ai aucun problème.
            • Partager sur Facebook
            • Partager sur Twitter
              17 novembre 2014 à 15:30:50

              Il faut donc que tu t'arranges pour l'instancier avant de l'utiliser
              • Partager sur Facebook
              • Partager sur Twitter
                17 novembre 2014 à 15:41:05

                Ma classe CommandeDao est une interface, mais regarde:

                public Client creerClient(HttpServletRequest request){
                		/**
                		 * On récupère les valeurs des champs, on effectue les verifications et on cree hydrate un bean Client
                		 */
                		String nom = getValeurChamp(request, CHAMP_NOM);
                		String prenom = getValeurChamp(request, CHAMP_PRENOM);
                		String adresse = getValeurChamp(request, CHAMP_ADRESSE);
                		String telephone = getValeurChamp(request, CHAMP_TELEPHONE);
                		String email = getValeurChamp(request, CHAMP_EMAIL);
                		
                		Client client = new Client();
                		
                		traiterNom( nom, client );
                        traiterPrenom( prenom, client );
                        traiterAdresse( adresse, client );
                        traiterTelephone( telephone, client );
                        traiterEmail( email, client );
                
                        try {
                            if ( erreurs.isEmpty() ) {
                                clientDao.creer( client );
                                resultat = "Succès de la création du client.";
                            } else {
                                resultat = "Échec de la création du client.";
                            }
                        } catch ( DAOException e ) {
                            setErreur( "imprévu", "Erreur imprévue lors de la création." );
                            resultat = "Échec de la création du client : une erreur imprévue est survenue, merci de réessayer dans quelques instants.";
                            e.printStackTrace();
                        }
                        return client;
                    }

                J'utilise le même fonctionnement ici et ça marche impec.

                • Partager sur Facebook
                • Partager sur Twitter
                  20 novembre 2014 à 11:58:25

                  Si ca peut vous aiguiller un petit peu: ClientDao et CommandeDao sont déjà initialisés dans le filtre au lancement de l'application, donc le problème ne vient pas d'ici.

                  public void init(FilterConfig config) throws ServletException {
                  		/* Récupération d'une instance de nos DAO Client et Commande */
                          this.clientDao = ((DAOFactory) config.getServletContext().getAttribute(CONF_DAO_FACTORY)).getClientDao();
                          this.commandeDao = ((DAOFactory) config.getServletContext().getAttribute(CONF_DAO_FACTORY)).getCommandeDao();
                  	}



                  • Partager sur Facebook
                  • Partager sur Twitter
                    20 novembre 2014 à 12:48:09

                    Avant cette ligne: commandeDao.creer(commande); Ajoute : System.out.println("CommandeDAO : " + commandeDao); Et dis moi ce qu ça affiche.

                    • Partager sur Facebook
                    • Partager sur Twitter
                      21 novembre 2014 à 15:51:30

                      Ca affiche null :/ C'est bizzare parce que ca fonctionne impec pour créer un client
                      • Partager sur Facebook
                      • Partager sur Twitter
                        21 novembre 2014 à 16:22:22

                        Contacte moi par message, tu pourras ensuite m'envoyer ton projet par e-mail

                        • Partager sur Facebook
                        • Partager sur Twitter
                          21 novembre 2014 à 17:13:43

                          C'est gentil, mais je viens juste de trouver la réponse au problème: j'avais oublié la méthode init() dans ma servlet de création de commande, alors que c'est la que je récupère mon objet commandeDao x)

                          Je passe le sujet en résolu, merci de ton aide en tout cas :)

                          • Partager sur Facebook
                          • Partager sur Twitter

                          Null Pointer Exception

                          × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                          × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                          • Editeur
                          • Markdown