J'obtiens une erreur lorsque j'essaie d'insérer des enregistrements à l'aide d'une instruction préparée:

Registration Servlet INSIDE try block:
Printing USER Values
====================
john
smith
john@gmail.com
john
Connection is: null
username: rth
password: rth
driver: oracle.jdbc.OracleDriver
url is: jdbc:oracle:thin:@localhost:1521:orcl
@@@@Record insertion error in Registration DAO@@@@
java.lang.ClassNotFoundException: oracle.jdbc.OracleDriver
    at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1714)
    at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1559)
    at java.lang.Class.forName0(Native Method)
    at java.lang.Class.forName(Class.java:264)
    at com.RTH.commons.DBConnection.getConnection(DBConnection.java:42)
    at com.RTH.DAO.RegistrationDAO.insert(RegistrationDAO.java:29)
    at com.RTH.Registration.RegistrationServlet.doPost(RegistrationServlet.java:43)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:647)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:728)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:305)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:222)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:123)
    at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:472)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:171)
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:99)
    at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:936)
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:407)
    at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1004)
    at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:589)
    at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:310)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
    at java.lang.Thread.run(Thread.java:745)
java.sql.SQLException: No suitable driver found for jdbc:oracle:thin:@localhost:1521:orcl
    at java.sql.DriverManager.getConnection(DriverManager.java:689)
    at java.sql.DriverManager.getConnection(DriverManager.java:247)
    at com.RTH.commons.DBConnection.getConnection(DBConnection.java:49)
    at com.RTH.DAO.RegistrationDAO.insert(RegistrationDAO.java:29)
    at com.RTH.Registration.RegistrationServlet.doPost(RegistrationServlet.java:43)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:647)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:728)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:305)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:222)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:123)
    at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:472)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:171)
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:99)
    at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:936)
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:407)
    at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1004)
    at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:589)
    at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:310)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
    at java.lang.Thread.run(Thread.java:745)
java.lang.NullPointerException
    at com.RTH.DAO.RegistrationDAO.insert(RegistrationDAO.java:31)
    at com.RTH.Registration.RegistrationServlet.doPost(RegistrationServlet.java:43)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:647)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:728)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:305)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:222)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:123)
    at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:472)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:171)
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:99)
    at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:936)
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:407)
    at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1004)
    at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:589)
    at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:310)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
    at java.lang.Thread.run(Thread.java:745)

Je suis en mesure d'imprimer les détails de connexion ainsi que le fichier de propriétés:

public class DBConnection {

    public static Connection getConnection() throws IOException, ClassNotFoundException, SQLException
    {
        Properties props = new Properties();
        props.load(DBConnection.class.getResourceAsStream("DBDetails.properties"));
        String username = props.getProperty("dbusername");
        String password = props.getProperty("dbpassword");
        String driver = props.getProperty("driver");
        String url = props.getProperty("url");
        Class.forName(driver);
        Connection con = DriverManager.getConnection(url, username, password);
        System.out.println("Connection is: " + con);
        System.out.println("username: " + username);;
        System.out.println("password: " + password);;
        System.out.println("driver: "+ driver);;
        System.out.println("url is: " + url);;
        return con;
    }
    public static void main(String[] args) throws IOException, ClassNotFoundException, SQLException {
        DBConnection.getConnection();
    }
}

EnregistrementDao fichier:

public class RegistrationDAO {

    public void insert(User user) {

        try {
            System.out.println("Printing USER Values");
            System.out.println("====================");
            System.out.println(user.getFirstName());
            System.out.println(user.getLastName());
            System.out.println(user.getEmail());
            System.out.println(user.getPassword());

            Connection con = DBConnection.getConnection();
            String query = "insert into TBL_USER(USR_FIRST_NAME,USR_LST_NAME,USR_PRIMARY_EMAIL,USR_PASSWORD) values(?,?,?,?)";
            PreparedStatement pst = con.prepareStatement(query);

            pst.setString(1, user.getFirstName()); //prints value
            pst.setString(2, user.getLastName());  //prints value
            pst.setString(3, user.getEmail());     //prints value
            pst.setString(4, user.getPassword());  //prints value
            pst.executeUpdate();
        } catch (Exception e) {
            System.out.println("@@@@Record insertion error in Registration DAO@@@@");
            e.printStackTrace();
        }
    }
}

Fichier de propriétés:

dbusername=rth
dbpassword=rth
driver=oracle.jdbc.driver.OracleDriver
url=jdbc:oracle:thin:@localhost:1521:orcl

J'ai vérifié que le nom d'utilisateur et le mot de passe de la base de données ne sont pas expirés et fonctionnent toujours. Le test de connexion a réussi. Tous les types de colonnes sont varchar2 200 octets. Je ne sais pas pourquoi il génère toujours une erreur.

-2
kittu 28 déc. 2015 à 13:15

3 réponses

Meilleure réponse

Suivre ces étapes a résolu mon problème:

  1. Supprimé ojdbc6-11.1.0.7.0.jar du chemin de classe et ajouté ojdbc6.jar
  2. Le nom du pilote a été modifié de:

    driver = oracle.jdbc.OracleDriver à driver = oracle.jdbc.driver.OracleDriver

  3. A collé un fichier ojdbc6.jar dans Dossier apache-tomcat-7.0.35-windows-x86\apache-tomcat-7.0.35\lib

Et ça a marché !!

1
kittu 28 déc. 2015 à 11:08

Vous pouvez voir l'instruction sysout car vous devez exécuter le programme dans votre IDE où le fichier de propriétés se trouve dans votre chemin de classe. Votre fichier de propriétés ne se trouve pas dans votre chemin de classe lorsque vous déployez l'application.

Vous pouvez changer le code comme:

props.load(DBConnection.class.getResourceAsStream("../conf/DBDetails.properties"));

Créer un répertoire 'conf' || dans le dossier lib contenant votre code (jars) et essayez de l'exécuter.

1
bluelurker 28 déc. 2015 à 10:29

Le problème se produit beaucoup plus tôt dans cette toute première ligne de votre exception:

props.load(DBConnection.class.getResourceAsStream("DBDetails.properties"));

Cela signifie que le fichier "DBDetails.properties" n'est évidemment pas dans le répertoire courant ni dans l'un des paramètres du chemin de classe.

Vérifiez où se trouve le fichier et définissez le chemin d'accès aux classes en conséquence ou déplacez-le au bon endroit.

MODIFIER APRÈS LA MISE À JOUR DE LA Q

Idem avec le pilote oracle. La classe du pilote oracle n'est pas chargée, elle ne se trouve probablement pas non plus sur le chemin de la classe - ou même pas du tout présente (ce que je parierais, car cela doit être téléchargé / installé explicitement à partir d'Oracle)

java.lang.ClassNotFoundException: oracle.jdbc.OracleDriver
1
Axel Amthor 28 déc. 2015 à 10:48