Signaler

Probleme d'un service web en java [Résolu]

Posez votre question razikabens 8Messages postés vendredi 12 février 2016Date d'inscription 21 avril 2017 Dernière intervention - Dernière réponse le 21 avril 2017 à 22:22 par KX
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;
}
Afficher la suite 
Utile
+1
plus moins
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);
    }
}
razikabens 8Messages postés vendredi 12 février 2016Date d'inscription 21 avril 2017 Dernière intervention - 21 avril 2017 à 21:51
merci beaucoup pour votre aide
ça marche bien simplement parfait
Répondre
KX 14159Messages postés samedi 31 mai 2008Date d'inscription ModérateurStatut 25 avril 2017 Dernière intervention - 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
Répondre
Donnez votre avis

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes.

Le fait d'être membre vous permet d'avoir des options supplémentaires.

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !