web-dev-qa-db-fra.com

Classe introuvable lors du chargement de JDBC org.postgresql.Driver

Je travaille sur un projet web et j'ai récemment installé postgres 9.1.1

Le serveur postgresql est opérationnel. Je peux me connecter via psql comme d'habitude et tout est chargé et correctement enregistré à partir d'un vidage de la base de données que j'ai fait à partir de 8.5.

J'ai donc également téléchargé le pilote JDBC4 pour la version 9.1 postgres ici: http://jdbc.postgresql.org/download/postgresql-jdbc-9.1-901.src.tar.gz

Je l'ai ajouté au chemin de build Java en utilisant les propriétés du projet via Eclipse.

C'est le code que j'utilise pour fournir une connexion db à d'autres classes (c'est-à-dire qu'il s'agit d'un singleton, j'obtiens une nouvelle connexion uniquement si l'existant est fermé ou nul, à partir d'un objet à la fois uniquement)

public abstract class DBConnection {
private static Connection connection = null;

public static void connect() {
    try {
        if (connection == null) {
            String Host = "127.0.0.1";
            String database = "xxxxx";
            String username = "xxxxx";
            String password = "xxxxx";
            String url = "jdbc:postgresql://" + Host + "/" + database;
            String driverJDBC = "org.postgresql.Driver";
            Class.forName(driverJDBC);
            connection = DriverManager.getConnection(url, username,
                    password); //line firing the class not found exception

        } else if (connection.isClosed()) {
            connection = null;
            connect();
        }
    } catch (SQLException e) {
        e.printStackTrace(System.err);
    } catch (Exception e) {
        e.printStackTrace(System.err);
    }
}

public static void disconnect() {
    if (connection != null) {
        try {
            connection.close();
        } catch (SQLException e) {
            Logger.getLogger(DBConnection.class.getName()).log(
                    Level.SEVERE, null, e);
        }
        }
    }

    public static Connection getConnection() {

        try {
            if (connection != null && !connection.isClosed()) {
                return connection;
            } else {
                connect();
                return connection;
            }
        } catch (SQLException e) {
            Logger.getLogger(DBConnection.class.getName()).log(Level.SEVERE,
                    null, e);
            return null;
        }
    }

    @Override
    public void finalize() {
        if (connection != null) {
            try {
                connection.close();
            } catch (SQLException e) {
                Logger.getLogger(DBConnection.class.getName()).log(
                        Level.SEVERE, null, e);
            }
        }
    }

}

Comme je l'ai écrit dans le titre lorsque j'exécute le projet et qu'une classe demande une connexion à cette classe, j'obtiens toujours une exception Class Not Found, car il ne peut apparemment pas charger org.postgresql.Driver.class Le pilote se trouve dans un sous-dossier du projet ~/lib/org.postgresql-9.1-901.jdbc4.jar et comme je l'ai dit ajouté au chemin de génération via les propriétés du projet Eclipse.

Je fournis également un exemple de requête pour laisser voir le comportement habituel de mes classes pour accéder à DBConnection:

public static final User validateUserCredentials(String id, String pswd) {
    Connection connection = DBConnection.getConnection();
    Logger.getLogger(Credentials.class.getName()).log(Level.SEVERE, (connection!=null)?"connection not null":"connection null");
    Statement stmt = null;
    Logger.getLogger(Home.class.getName()).log(Level.SEVERE, "validating credentials for user: username : " + id + " password : " + pswd);
    String sql = "Select * from fuser where id = '" + id + "'";
    ResultSet resultset = null;
    try {
        stmt = connection.createStatement();
        resultset = stmt.executeQuery(sql);
        Logger.getLogger(Credentials.class.getName())
                .log(Level.SEVERE, sql);
        resultset.next();
        String password = resultset.getString("pswd");
        if (pswd.equals(password))
            return new User(id, pswd);
    } catch (SQLException ex) {

        Logger.getLogger(Credentials.class.getName()).log(Level.SEVERE,
                null, ex);
    } finally {
        if (stmt != null)
            stmt = null;

        if (resultset != null)
            resultset = null;
        if (connection != null) {
            try {
                connection.close();
            } catch (SQLException e) {

            }
            connection = null;
        }
    }
    return null;
}
17
urobo

Je travaille sur un projet web et j'ai récemment installé postgres 9.1.1

...

Je l'ai ajouté au Java en utilisant les propriétés du projet via Eclipse. =

C'est la mauvaise façon. Ce fichier JAR doit être déposé directement dans /WEB-INF/lib dossier du projet Web sans jouer avec le Build Path dans les propriétés du projet. Ce dossier est une partie standard du chemin de classe d'exécution de webapp.


Sans rapport avec le problème concret: vous avez un gros défaut de conception dans votre classe DBConnection. Vous avez déclaré Connection comme static ce qui rend essentiellement votre connexion non threadsafe . Utilisez un pool de connexions et n'affectez jamais Connection (ni Statement ni ResultSet) comme variable de classe/instance. Ils doivent être créés et fermés de la même manière try-finally bloquer comme où vous exécutez la requête. De plus, vous avez là aussi un trou d'injection SQL. Utilisez PreparedStatement au lieu de concaténer des variables contrôlées par l'utilisateur dans la chaîne SQL.

Voir également:

25
BalusC

Ajoutez cette dépendance dans votre pom:

    <dependency>
        <groupId>org.postgresql</groupId>
        <artifactId>postgresql</artifactId>
        <version>9.4-1203-jdbc4</version>
    </dependency>
4
Bruno Dell'Orto

La première chose que je ferais est de déballer le pot et de confirmer que le pilote est vraiment là-dedans comme org.postgresql.Driver. Je constate en regardant jarfinder et les sites associés qu'il n'y a pas de pot Postgres 9.x contenant org.postgresql.Driver.

3
Jim Kiley