Problème d'affichage des données dans un combobox
Résolu/Fermé
Streamooc
Messages postés
79
Date d'inscription
samedi 17 juin 2017
Statut
Membre
Dernière intervention
8 février 2023
-
Modifié le 18 juil. 2018 à 12:59
Streamooc Messages postés 79 Date d'inscription samedi 17 juin 2017 Statut Membre Dernière intervention 8 février 2023 - 22 juil. 2018 à 02:05
Streamooc Messages postés 79 Date d'inscription samedi 17 juin 2017 Statut Membre Dernière intervention 8 février 2023 - 22 juil. 2018 à 02:05
A voir également:
- Problème d'affichage des données dans un combobox
- Validation des données excel - Guide
- Effacer les données de navigation - Guide
- Reinstaller windows sans perte de données - Guide
- Affichage double ecran - Guide
- Windows 11 affichage classique - Guide
2 réponses
KX
Messages postés
16733
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
31 janvier 2024
3 015
18 juil. 2018 à 13:19
18 juil. 2018 à 13:19
Bonjour,
Pour commencer, les scriptlets c'est mal, le code Java devrait être dans un fichier Java, les JSP ne devraient être là que pour faire de l'affichage, pas pour appeler la base de données ou je ne sais quel traitement.
Quant à ton code,
Le scriptlet
Rien à voir donc avec un code HTML où l'on devrait trouver dans la balise
Remarque : tu as un
Pour commencer, les scriptlets c'est mal, le code Java devrait être dans un fichier Java, les JSP ne devraient être là que pour faire de l'affichage, pas pour appeler la base de données ou je ne sais quel traitement.
Quant à ton code,
comboPaysest un JComboBox de l'API Swing !!! Qu'est-ce que ça vient faire dans une JSP !?
<%@page import="javax.swing.JComboBox"%> ... JComboBox comboPays=new JComboBox(); ... <label>Selectionner le pays</label> <select class="form-control combobox" name="" value="<%=comboPays %>"> </select>
Le scriptlet
<%= %>va afficher le toString de ce composant Swing, tu peux regarder le code HTML généré par ce morceau de code mais ça va te donner un truc un rallonge du genre :
javax.swing.JComboBox[, 0, 0, 0x0, invalid, layout=javax.swing.plaf.metal.MetalComboBoxUI$MetalComboBoxLayoutManager, alignmentX=0.0, alignmentY=0.0, border=, flags=328, maximumSize=, minimumSize=, preferredSize=, isEditable=false, lightWeightPopupEnabled=true, maximumRowCount=8, selectedItemReminder=]
Rien à voir donc avec un code HTML où l'on devrait trouver dans la balise
selectune liste de balises
option:
<select> <option value="id_pays1">Pays1</option> <option value="id_pays2">Pays2</option> <option value="id_pays3">Pays3</option> <option value="id_pays4">Pays4</option> </select>
Remarque : tu as un
catch(SQLException e) { e.printStackTrace(); }dont il serait intéressant d'afficher un message d'erreur dans la JSP au cas où il y ait eu une erreur.
Streamooc
Messages postés
79
Date d'inscription
samedi 17 juin 2017
Statut
Membre
Dernière intervention
8 février 2023
Modifié le 19 juil. 2018 à 10:38
Modifié le 19 juil. 2018 à 10:38
Merci beaucoup KX pour tout.J'ai pu l'afficher finalement.Mais pour insérer un client dans la base de données j'ai cette erreur j'ai cherché en vain mais pas d'issue.Ci-dessous:
Problème de requête !!!!
////////Sql
Problème de requête !!!!
com.mysql.jdbc.exceptions.MySQLIntegrityConstraintViolationException: Cannot add or update a child row: a foreign key constraint fails (`owo`.`clients`, CONSTRAINT `fk_clients_pays1` FOREIGN KEY (`pays_idpays`) REFERENCES `pays` (`idpays`) ON DELETE NO ACTION ON UPDATE NO ACTION) at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:931) at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:2870) at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:1573) at com.mysql.jdbc.ServerPreparedStatement.serverExecute(ServerPreparedStatement.java:1169) at com.mysql.jdbc.ServerPreparedStatement.executeInternal(ServerPreparedStatement.java:693) at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:1404) at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:1318) at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:1303) at sn.mobilebanking.dao.DaoClientImpl.ajouterClient(DaoClientImpl.java:179) at sn.mobilebanking.service.ServiceClientImpl.addClient(ServiceClientImpl.java:29) at sn.mobilebanking.presentation.CheckRegisterAllClientControleur.doPost(CheckRegisterAllClientControleur.java:57) 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:219) at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:110) 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:962) at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:116) at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:445) at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1115) at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:637) at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:316) 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)
//////Méthode d'ajout du client @Override public void ajouterClient(Client client) { // Gestion de la sécurité du mot de passe SecurityMechanism sm = new SecurityMechanism(); // Préparation de la requête String sql = "INSERT INTO clients(clients_name,clients_email,clients_numero,clients_password,clients_solde,clients_etat_compte,pays_idpays) VALUES (?,?,?,?,?,?,?)"; try { // Création d'une zone de requête PreparedStatement pst = conn.prepareStatement(sql); // Transmission des valeurs aux paramètres de la requête pst.setString(1, client.getClients_name()); pst.setString(2, client.getClients_email()); pst.setString(3, client.getClients_numero()); pst.setString(4, sm.getEncrypted(client.getClients_password())); pst.setString(5, client.getClients_solde()); pst.setString(6, client.getClients_etat_compte()); pst.setInt(7, client.getPays_idpays()); // Execution de la requete pst.executeUpdate(); System.out.println("Insertion du client réussie avec succès !!!!"); } catch (SQLException e) { System.out.println("Problème de requête !!!!"); e.printStackTrace(); } }
////////Sql
-- ----------------------------------------------------- -- Table `OWO`.`pays` -- ----------------------------------------------------- CREATE TABLE IF NOT EXISTS `OWO`.`pays` ( `idpays` INT NOT NULL AUTO_INCREMENT, `pays_code` INT NOT NULL, `pays_indicatif` INT NOT NULL, `pays_nom` VARCHAR(45) NULL, PRIMARY KEY (`idpays`), UNIQUE INDEX `pays_code_UNIQUE` (`pays_code` ASC), UNIQUE INDEX `pays_indicatif_UNIQUE` (`pays_indicatif` ASC)) ENGINE = InnoDB; -- ----------------------------------------------------- -- Table `OWO`.`clients` -- ----------------------------------------------------- CREATE TABLE IF NOT EXISTS `OWO`.`clients` ( `idclients` INT NOT NULL AUTO_INCREMENT, `clients_name` VARCHAR(45) NOT NULL, `clients_email` VARCHAR(45) NOT NULL, `clients_numero` VARCHAR(45) NOT NULL, `clients_password` VARCHAR(45) NULL, `clients_solde` VARCHAR(45) NULL, `clients_etat_compte` VARCHAR(45) NULL, `pays_idpays` INT NOT NULL, PRIMARY KEY (`idclients`), UNIQUE INDEX `clients_email_UNIQUE` (`clients_email` ASC), UNIQUE INDEX `clients_numero_UNIQUE` (`clients_numero` ASC), INDEX `fk_clients_pays1_idx` (`pays_idpays` ASC), CONSTRAINT `fk_clients_pays1` FOREIGN KEY (`pays_idpays`) REFERENCES `OWO`.`pays` (`idpays`) ON DELETE NO ACTION ON UPDATE NO ACTION) ENGINE = InnoDB;
KX
Messages postés
16733
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
31 janvier 2024
3 015
19 juil. 2018 à 11:22
19 juil. 2018 à 11:22
Là c'est un pur problème de SQL, tu ferais la même requête dans un éditeur SQL tu aurais la même erreur, Java ne fait que la récupérer et la transformer en exception.
Dans ta table clients tu imposes qu'un client doit toujours avoir un idpays qui existe déjà dans la table pays.
C'est cette contrainte que tu n'as pas respecté, en ajoutant un client avec un idpays qui n'existe pas.
Remarque : il faut fermer tes ressources, un PreparedStatement ça s'ouvre mais ça doit se fermer aussi, y compris en cas d'exception. Le plus sécurisé étant de passer par un try-with-ressources.
Ne pas hésiter non plus à propager tes exceptions. Actuellement tu les masques et tu continues comme si ça avait fonctionné, mais il serait pertinent que cette erreur remonte, pour pouvoir indiquer au reste du programme qu'il y a eu un problème à l'ajout, sinon on va continuer à manipuler un client qui n'existe pas, de même qu'on essaye de l'ajouter à un pays qui n'existe pas (une autre erreur ignorée précédemment ?)
Exemple :
Remarque : pour que l'information soit utile, il faut que la méthode toString() de la classe Client contienne tous les attributs du client qui sont utilisés (sauf le password bien sûr, qui doit être caché).
Avec par exemple un exception personnalisée comme celle-ci :
Dans ta table clients tu imposes qu'un client doit toujours avoir un idpays qui existe déjà dans la table pays.
CONSTRAINT `fk_clients_pays1` FOREIGN KEY (`pays_idpays`) REFERENCES `OWO`.`pays` (`idpays`) ON DELETE NO ACTION ON UPDATE NO ACTION)
C'est cette contrainte que tu n'as pas respecté, en ajoutant un client avec un idpays qui n'existe pas.
Remarque : il faut fermer tes ressources, un PreparedStatement ça s'ouvre mais ça doit se fermer aussi, y compris en cas d'exception. Le plus sécurisé étant de passer par un try-with-ressources.
Ne pas hésiter non plus à propager tes exceptions. Actuellement tu les masques et tu continues comme si ça avait fonctionné, mais il serait pertinent que cette erreur remonte, pour pouvoir indiquer au reste du programme qu'il y a eu un problème à l'ajout, sinon on va continuer à manipuler un client qui n'existe pas, de même qu'on essaye de l'ajouter à un pays qui n'existe pas (une autre erreur ignorée précédemment ?)
Exemple :
@Override public void ajouterClient(Client client) throws ProjectException { SecurityMechanism sm = new SecurityMechanism(); String sql = "INSERT INTO clients (clients_name, clients_email, clients_numero, clients_password, clients_solde, clients_etat_compte, pays_idpays) VALUES (?, ?, ?, ?, ?, ?, ?)"; try (PreparedStatement pst = conn.prepareStatement(sql)) { pst.setString(1, client.getClients_name()); pst.setString(2, client.getClients_email()); pst.setString(3, client.getClients_numero()); pst.setString(4, sm.getEncrypted(client.getClients_password())); pst.setString(5, client.getClients_solde()); pst.setString(6, client.getClients_etat_compte()); pst.setInt(7, client.getPays_idpays()); int result = pst.executeUpdate(); if (result != 1) { throw new IllegalStateException("executeUpdate a retourné " + result); } } catch (SQLException | RuntimeException e) { throw new ProjectException("Le client n'a pas pu être ajouté : " + client, e); } }
Remarque : pour que l'information soit utile, il faut que la méthode toString() de la classe Client contienne tous les attributs du client qui sont utilisés (sauf le password bien sûr, qui doit être caché).
Avec par exemple un exception personnalisée comme celle-ci :
public class ProjectException extends Exception { private static final long serialVersionUID = 1; public ProjectException(String message) { super(message); } public ProjectException(String message, Throwable cause) { super(message, cause); } public ProjectException(Throwable cause) { super(cause); } }
Streamooc
Messages postés
79
Date d'inscription
samedi 17 juin 2017
Statut
Membre
Dernière intervention
8 février 2023
Modifié le 19 juil. 2018 à 15:21
Modifié le 19 juil. 2018 à 15:21
Bonjour KX j'ai cherché en vain.
Je n'ai pas bien compris votre explication:
Au fait les pays sont déjà enrégistrées dans la base de données avec leur id qui est autoincrémenté.Et puis quand je procède à l'insertion des clients au niveau de WampServeur ça passe normalement.Le problème c'est quand je le fais à partir du code java.
J'ai essayé avec vos remarques précédentes mais l'erreur y est toujours:
Quand j'essaie de passer par la table pays afin de récupérer son id c'est à dire la dernière ligne de la table client comme ci-dessous j'ai cette erreur:
Je ne sais plus quoi faire.Ici c'est la table Client
//Vue
Je n'ai pas bien compris votre explication:
CONSTRAINT `fk_clients_pays1` FOREIGN KEY (`pays_idpays`) REFERENCES `OWO`.`pays` (`idpays`) ON DELETE NO ACTION ON UPDATE NO ACTION)
Au fait les pays sont déjà enrégistrées dans la base de données avec leur id qui est autoincrémenté.Et puis quand je procède à l'insertion des clients au niveau de WampServeur ça passe normalement.Le problème c'est quand je le fais à partir du code java.
J'ai essayé avec vos remarques précédentes mais l'erreur y est toujours:
Caused by: com.mysql.jdbc.exceptions.MySQLIntegrityConstraintViolationException: Cannot add or update a child row: a foreign key constraint fails (`owo`.`clients`, CONSTRAINT `fk_clients_pays1` FOREIGN KEY (`pays_idpays`) REFERENCES `pays` (`idpays`) ON DELETE NO ACTION ON UPDATE NO ACTION)
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:931)
at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:2870)
at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:1573)
at com.mysql.jdbc.ServerPreparedStatement.serverExecute(ServerPreparedStatement.java:1169)
at com.mysql.jdbc.ServerPreparedStatement.executeInternal(ServerPreparedStatement.java:693)
at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:1404)
at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:1318)
at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:1303)
at sn.mobilebanking.dao.DaoClientImpl.ajouterClient(DaoClientImpl.java:203)
... 23 more
Quand j'essaie de passer par la table pays afin de récupérer son id c'est à dire la dernière ligne de la table client comme ci-dessous j'ai cette erreur:
@Override public void ajouterClient(Client client) throws ProjectException { SecurityMechanism sm = new SecurityMechanism(); String sql = "INSERT INTO clients (clients_name, clients_email, clients_numero, clients_password, clients_solde, clients_etat_compte, pays_idpays) VALUES (?, ?, ?, ?, ?, ?, ?)"; try (PreparedStatement pst = conn.prepareStatement(sql)) { pst.setString(1, client.getClients_name()); pst.setString(2, client.getClients_email()); pst.setString(3, client.getClients_numero()); pst.setString(4, sm.getEncrypted(client.getClients_password())); pst.setString(5, client.getClients_solde()); pst.setString(6, client.getClients_etat_compte()); // pst.setInt(7, client.getPays_idpays()); pst.setInt(7, client.getPays().getIdpays()); int result = pst.executeUpdate(); if (result != 1) { throw new IllegalStateException("executeUpdate a retourné " + result); } } catch (SQLException | RuntimeException e) { throw new ProjectException("Le client n'a pas pu être ajouté : " + client, e); } }
sn.mobilebanking.domaine.ProjectException: Le client n'a pas pu être ajouté : sn.mobilebanking.domaine.Client@50fbd774
at sn.mobilebanking.dao.DaoClientImpl.ajouterClient(DaoClientImpl.java:208)
at sn.mobilebanking.service.ServiceClientImpl.addClient(ServiceClientImpl.java:30)
at sn.mobilebanking.presentation.CheckRegisterAllClientControleur.doPost(CheckRegisterAllClientControleur.java:59)
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:219)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:110)
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:962)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:116)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:445)
at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1115)
at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:637)
at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:316)
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)
Je ne sais plus quoi faire.Ici c'est la table Client
public class Client implements Serializable{ private int idclients; private String clients_name; private String clients_email; private String clients_numero; private String clients_password; private String clients_solde; private String clients_etat_compte; private Pays pays;//Clé étrangère ////Controleur @WebServlet("/chargerAjoutClient") public class ChargementAjoutClientControleur extends HttpServlet { private static final long serialVersionUID = 1L; public static final String ATT_FORM = "form"; public ChargementAjoutClientControleur() { super(); } /** * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response) */ protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // TODO Auto-generated method stub //response.getWriter().append("Served at: ").append(request.getContextPath()); ServiceClientImpl serv=new ServiceClientImpl(); List<Pays> listePays=serv.listerPays();//Lister les noms des pays request.setAttribute("listePays", listePays); //Redirection vers la liste des modérateurs request.getRequestDispatcher("client/ajouterClient.jsp").forward(request, response); } protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // } } }
//Vue
<label>Selectionner le pays</label> <select class="form-control" name="nomPays"> <c:forEach var="pays" items="${listePays }"> <option value="${pays.idpays }">${pays.idpays }- ${pays.pays_nom }</option> </c:forEach> </select>
KX
Messages postés
16733
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
31 janvier 2024
3 015
>
Streamooc
Messages postés
79
Date d'inscription
samedi 17 juin 2017
Statut
Membre
Dernière intervention
8 février 2023
19 juil. 2018 à 15:33
19 juil. 2018 à 15:33
"ProjectException: Le client n'a pas pu être ajouté : sn.mobilebanking.domaine.Client@50fbd774"
Comme je le mettais dans ma remarque, pour que cette information soit utile, il faut que la méthode toString() de la classe Client contienne tous les attributs du client qui sont utilisés.
En particulier ce que l'on veut quand l'exception l'affiche c'est savoir que est l'id du pays qui a été mis dans la requête, puisque c'est un id qui n'existe pas il faut savoir quelle est sa valeur et comprendre d'où elle vient.
Pour faire le toString de la classe Client, tu peux le faire à la main ou en utilisant ton IDE.
Par exemple sur Eclipse, tu fais un clic droit dans le code de la classe Client, tu sélectionnes le menu "Source" et le sous-menu "Generate toString()"
Comme je le mettais dans ma remarque, pour que cette information soit utile, il faut que la méthode toString() de la classe Client contienne tous les attributs du client qui sont utilisés.
En particulier ce que l'on veut quand l'exception l'affiche c'est savoir que est l'id du pays qui a été mis dans la requête, puisque c'est un id qui n'existe pas il faut savoir quelle est sa valeur et comprendre d'où elle vient.
Pour faire le toString de la classe Client, tu peux le faire à la main ou en utilisant ton IDE.
Par exemple sur Eclipse, tu fais un clic droit dans le code de la classe Client, tu sélectionnes le menu "Source" et le sous-menu "Generate toString()"
Streamooc
Messages postés
79
Date d'inscription
samedi 17 juin 2017
Statut
Membre
Dernière intervention
8 février 2023
Modifié le 19 juil. 2018 à 17:29
Modifié le 19 juil. 2018 à 17:29
Hello KX,voici la méthode toString()
Mais dans le résultat les champs password et pays sont restés nulls.
Je ne sais pas ce qui ne va pas.Est ce que le problème vient d'ici?
@Override public String toString() { return "Client [idclients=" + idclients + ", clients_name=" + clients_name + ", clients_email=" + clients_email + ", clients_numero=" + clients_numero + ", clients_password=" + clients_password + ", clients_solde=" + clients_solde + ", clients_etat_compte=" + clients_etat_compte + ", pays=" + pays + "]"; }
Mais dans le résultat les champs password et pays sont restés nulls.
sn.mobilebanking.domaine.ProjectException: Le client n'a pas pu être ajouté : Client [idclients=0, clients_name=zozor, clients_email=zozor@gmail.com, clients_numero=12, clients_password=null, clients_solde=12000, clients_etat_compte=OK, pays=null]
at sn.mobilebanking.dao.DaoClientImpl.ajouterClient(DaoClientImpl.java:209)
at sn.mobilebanking.service.ServiceClientImpl.addClient(ServiceClientImpl.java:30)
at sn.mobilebanking.presentation.CheckRegisterAllClientControleur.doPost(CheckRegisterAllClientControleur.java:59)
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:219)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:110)
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:962)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:116)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:445)
at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1115)
at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:637)
at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:316)
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)
Caused by: java.lang.NullPointerException
at sn.mobilebanking.dao.DaoClientImpl.ajouterClient(DaoClientImpl.java:203)
... 23 more
Je ne sais pas ce qui ne va pas.Est ce que le problème vient d'ici?
pst.setString(4, sm.getEncrypted(client.getClients_password())); pst.setInt(7, client.getPays().getIdpays());
KX
Messages postés
16733
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
31 janvier 2024
3 015
>
Streamooc
Messages postés
79
Date d'inscription
samedi 17 juin 2017
Statut
Membre
Dernière intervention
8 février 2023
Modifié le 19 juil. 2018 à 17:43
Modifié le 19 juil. 2018 à 17:43
Il faut regarder où est la ligne 203 dans DaoClientImpl.java mais effectivement, si pays=null, le client.getPays() va faire un NullPointerException.
Remarque : ce n'est pas la même erreur qu'avant, puisque tu avais une SQLException au moment où tu faisais la requête, et que maintenant le programme plante avant même d'avoir fait la requête...
Ceci étant dit on avance quand même un peu, car maintenant tu as le détail du client, tu as pu facilement identifier qu'il y avait un problème sur le pays (mais ça on s'en doutait déjà un peu), mais également un problème sur le password alors que jusqu'à présent on n'en savait rien.
Mais pour corriger le problème il va falloir regarder le code d'avant, au moment où tu construis l'objet Client et que tu fais tes setPays et setPassword (si tu les as fait) pour comprendre pourquoi ces valeurs sont null.
Il va donc falloir s'intéresser aux différentes méthodes mentionnées dans la stackTrace, ce sont elles qui ont conduit à l'erreur :
Remarque : ce n'est pas la même erreur qu'avant, puisque tu avais une SQLException au moment où tu faisais la requête, et que maintenant le programme plante avant même d'avoir fait la requête...
Ceci étant dit on avance quand même un peu, car maintenant tu as le détail du client, tu as pu facilement identifier qu'il y avait un problème sur le pays (mais ça on s'en doutait déjà un peu), mais également un problème sur le password alors que jusqu'à présent on n'en savait rien.
Mais pour corriger le problème il va falloir regarder le code d'avant, au moment où tu construis l'objet Client et que tu fais tes setPays et setPassword (si tu les as fait) pour comprendre pourquoi ces valeurs sont null.
Il va donc falloir s'intéresser aux différentes méthodes mentionnées dans la stackTrace, ce sont elles qui ont conduit à l'erreur :
- sn.mobilebanking.dao.DaoClientImpl.ajouterClient(DaoClientImpl.java:203)
- sn.mobilebanking.service.ServiceClientImpl.addClient(ServiceClientImpl.java:30)
- sn.mobilebanking.presentation.CheckRegisterAllClientControleur.doPost(CheckRegisterAllClientControleur.java:59)
Modifié le 18 juil. 2018 à 21:29
Bonjour KX.Merci pour la réponse.Au fait avec cette portion de code les données sont statiques.Ce que je voudrais c'est afficher ces pays d'une manière dynamique(ces pays sont déjà enregistrés dans une table 'clients').Je peux écrire une méthode dans le Dao pour récupérer la liste des pays mais je ne sais pas comment l'afficher dans un checkbox.
18 juil. 2018 à 21:41
Remarque : normalement un nom Java ne devrait jamais contenir de (sauf pour les constantes).
De plus il n'est pas nécessaire de rappeler dans chaque méthode le nom de la classe, si tu fais ou ça suffit, pas besoin de faire ou , on sait que c'est un pays.