Probleme d'un service web en java
Résolu
razikabens
Messages postés
8
Date d'inscription
Statut
Membre
Dernière intervention
-
KX Messages postés 16761 Date d'inscription Statut Modérateur Dernière intervention -
KX Messages postés 16761 Date d'inscription Statut Modérateur Dernière intervention -
j créé un service web qui faire la recherche d'un étudiant et prend en paramètre le matricule et retourne boolean mais le service retourne rien je c pas ou est le problème
@WebMethod(operationName = "Recherche_Etudiant")
@SuppressWarnings("CallToPrintStackTrace")
public boolean Recherche_Etuciant(@WebParam(name = "Matricule") int Matricule) {
try {
String sql = "select * from etudiant where N_ins =? ";
Connection c = DB.ConnectDb.getCon();
PreparedStatement ps = c.prepareStatement(sql);
ps.setInt(1, Matricule);
ResultSet rs = ps.executeQuery(sql);
return rs.next();
} catch (SQLException ex) {
Logger.getLogger(rechEtud.class.getName()).log(Level.SEVERE, null, ex);
return false;
}
A voir également:
- Probleme d'un service web en java
- Waptrick java football - Télécharger - Jeux vidéo
- Jeux java itel - Télécharger - Jeux vidéo
- Web office - Guide
- Service spouleur - Guide
- Eclipse java - Télécharger - Langages
1 réponse
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); } }
ça marche bien simplement parfait
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