Probleme d'un service web en java
Résolu/Fermé
razikabens
Messages postés
8
Date d'inscription
vendredi 12 février 2016
Statut
Membre
Dernière intervention
21 avril 2017
-
Modifié le 21 avril 2017 à 16:39
KX Messages postés 16753 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 25 novembre 2024 - 21 avril 2017 à 22:22
KX Messages postés 16753 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 25 novembre 2024 - 21 avril 2017 à 22:22
A voir également:
- Probleme d'un service web en java
- Waptrick java football - Télécharger - Jeux vidéo
- Jeux java itel football - Télécharger - Jeux vidéo
- Web office - Guide
- Java apk - Télécharger - Langages
- Service spouleur - Guide
1 réponse
KX
Messages postés
16753
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
25 novembre 2024
3 019
21 avril 2017 à 19:51
21 avril 2017 à 19:51
Bonjour,
Déjà il faudrait respecter les conventions de nommage Java.
C'est facultatif en Java SE, mais ça va rapidement te poser problème en Java EE puisque les mécanismes d'introspections supposent que celle-ci sont respecter pour pouvoir manipuler les données.
Donc déjà ce sera
Ensuite, ton code de connexion en base de données est incomplet, il faudrait par exemple penser à fermer la connexion que tu ouvres, car Java ne va pas le faire tout seul et ça va planter la base de données.
Pour faire ça bien tu as les try-with-resources qui sont très pratique.
Remarque : normalement dans une architecture serveur Java EE classique (n-tiers) la couche de web service et la couche base de données sont totalement indépendante, tu ne devrais jamais avoir les deux dans le même code.
Enfin (et surtout) la seule chose que fait avec ta méthode c'est renvoyer true/false si l'étudiant existe, mais tu ne récupères pas du tout les données obtenues avec ton select *
Remarque : tu as mélangé l'utilisation d'un Statement normal et d'un PreparedStatement car au moment de l'appel tu utilises un query(sql) qui fait la requête avec le ? mais ne prends pas le setInt fait avant...
Exemple :
Déjà il faudrait respecter les conventions de nommage Java.
C'est facultatif en Java SE, mais ça va rapidement te poser problème en Java EE puisque les mécanismes d'introspections supposent que celle-ci sont respecter pour pouvoir manipuler les données.
Donc déjà ce sera
rechercheEtudiantcomme nom de méthode et
matriculeen paramètre.
Ensuite, ton code de connexion en base de données est incomplet, il faudrait par exemple penser à fermer la connexion que tu ouvres, car Java ne va pas le faire tout seul et ça va planter la base de données.
Pour faire ça bien tu as les try-with-resources qui sont très pratique.
Remarque : normalement dans une architecture serveur Java EE classique (n-tiers) la couche de web service et la couche base de données sont totalement indépendante, tu ne devrais jamais avoir les deux dans le même code.
Enfin (et surtout) la seule chose que fait avec ta méthode c'est renvoyer true/false si l'étudiant existe, mais tu ne récupères pas du tout les données obtenues avec ton select *
Remarque : tu as mélangé l'utilisation d'un Statement normal et d'un PreparedStatement car au moment de l'appel tu utilises un query(sql) qui fait la requête avec le ? mais ne prends pas le setInt fait avant...
Exemple :
package database; import java.sql.*; import java.util.*; import java.util.function.*; import java.util.logging.*; import modele.Etudiant; public class EtudiantDao { private static final Logger LOGGER = Logger.getLogger("EtudiantDao"); private Connection getConnection() { return DB.ConnectDb.getCon(); } private <E> Optional<E> genericFind(String sql, Consumer<PreparedStatement> setter, Function<ResultSet, E> getter, Supplier<String> exceptionMessage) { try (Connection connection = getConnection()) { try (PreparedStatement statement = connection.prepareStatement(sql)) { setter.accept(statement); try (ResultSet resultSet = statement.executeQuery()) { if (!resultSet.next()) { return Optional.empty(); } E value = getter.apply(resultSet); if (resultSet.next()) { throw new SQLException("More than one result found for: " + sql); } return Optional.of(value); } } catch (SQLException | RuntimeException e) { LOGGER.log(Level.WARNING, e, exceptionMessage); return Optional.empty(); } } catch (SQLException | RuntimeException e) { LOGGER.log(Level.SEVERE, e, exceptionMessage); return Optional.empty(); } } public Optional<Etudiant> findEtudiantByMatricule(int matricule) { return genericFind("select nom,prenom from etudiant where N_ins = ?", statement -> { try { statement.setInt(1, matricule); } catch (SQLException e) { throw new IllegalArgumentException(e); } }, resultSet -> { try { String nom = resultSet.getString(1); String prenom = resultSet.getString(2); return new Etudiant(nom, prenom); } catch (SQLException e) { throw new IllegalArgumentException(e); } }, () -> "Can't findEtudiantByMatricule: " + matricule); } }
package webservice; import javax.jws.*; import database.EtudiantDao; import modele.Etudiant; public class EtudiantWebService { private EtudiantDao getEtudiantDao() { return new EtudiantDao(); } @WebMethod(operationName = "Recherche_Etudiant") public Etudiant rechercheEtudiant(@WebParam(name = "Matricule") int matricule) { return getEtudiantDao().findEtudiantByMatricule(matricule).orElse(null); } }
21 avril 2017 à 21:51
ça marche bien simplement parfait
21 avril 2017 à 22:22
Exemple :
Evidemment ce genre de code générique pour les bases de données il y en a déjà des tas sur internet, citons notamment Spring JdbcTemplate