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
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:

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
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
rechercheEtudiant
comme nom de méthode et
matricule
en 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);
    }
}
1
razikabens Messages postés 8 Date d'inscription vendredi 12 février 2016 Statut Membre Dernière intervention 21 avril 2017
21 avril 2017 à 21:51
merci beaucoup pour votre aide
ça marche bien simplement parfait
0
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 à 22:22
Remarque : on peut simplifier un petit peu pour s'éviter le try/catch dans chaque méthode utilisatrice mais il faut pour ça créer ses propres interfaces fonctionnelles à utiliser dans la partie générique pour qu'elles acceptent les SQLException contrairement aux Consumer et Function de Java.

Exemple :

public class GenericDao {

    @FunctionalInterface
    public static interface PreparedStatementSetter {
        public void setValues(PreparedStatement statement) throws SQLException;        
    }

    @FunctionalInterface
    public static interface ResultSetGetter<E> {
        public E getValues(ResultSet resultSet) throws SQLException;        
    }

    public static <E> Optional<E> genericFind(String sql, PreparedStatementSetter setter, ResultSetGetter<E> getter, Supplier<String> exceptionMessage) {
    // ...

public class EtudiantDao {

    public Optional<Etudiant> findEtudiantByMatricule(int matricule) {
        return GenericDao.genericFind("select nom,prenom from etudiant where N_ins = ?",
                statement -> statement.setInt(1, matricule),
                resultSet -> new Etudiant(resultSet.getString(1), resultSet.getString(2)),
                () -> "Can't findEtudiantByMatricule: " + matricule);
    }
}

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
0