Partage
  • Partager sur Facebook
  • Partager sur Twitter

Java EE et PostgreSQL

    30 juillet 2012 à 16:35:29

    Bonjour,

    J'essaie de me connecter à une base de données PostgreSQL via une servlet en Java EE. Le service de PostgreSQL est bel et bien démarré.

    J'ai suivi le tutoriel de cysboy (http://www.siteduzero.com/tutoriel-3-119257-se-connecter-a-sa-bdd.html), mais malgré ça, j'arrive toujours et encore à avoir la même erreur :

    java.lang.NullPointerException
            test.Home.doPost(Home.java:32)
            javax.servlet.http.HttpServlet.service(HttpServlet.java:637)
            javax.servlet.http.HttpServlet.service(HttpServlet.java:717)


    Je comprends très bien ce qu'elle signifie mais je n'arrive pas à la régler. J'ai essayé de nombreuses possibilités (qui varient en fonction de ce que j'arrive à trouver sur Internet), je ne pourrai donc pas vous recenser tout ce que j'ai déjà testé.

    La dernière version en date est la suivante.

    Le code de la servlet :

    public class Home extends HttpServlet {
    
    	/**
    	 * 
    	 */
    	private static final long serialVersionUID = -5055051951133366760L;
    	private static final String ENCODING = "UTF-8";
    	private Connection c = null;
    	
    	public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException {
    		response.setContentType("text/html; charset=" + ENCODING);
    		
    		request.getRequestDispatcher("test.jsp").forward(request, response);
    	}
    	
    	public void doPost(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException {
    		response.setContentType("text/html; charset=" + ENCODING);
    		try {
    			if(c == null) init();
    			Statement s = c.createStatement(); // Ligne 32 ici
    			
    		} catch (SQLException e) {
    			e.printStackTrace();
    		}
    	}
    	
    	public void init() throws ServletException {
    		if(c == null) {
    			try {
    				Class.forName("org.postgresql.Driver");
    				c = DriverManager.getConnection("jdbc:postgresql://127.0.0.1:5432/test", "user", "password");
    			} catch (ClassNotFoundException e) {
    				e.printStackTrace();
    			} catch (SQLException e) {
    				e.printStackTrace();
    			}
    		}
    	}
    }
    


    Je sais que la solution que je présente est nettement différente de ce qui est proposé dans le tutoriel mais ça ne fonctionnait pas non plus.

    Je vous remercie par avance.
    • Partager sur Facebook
    • Partager sur Twitter
      31 juillet 2012 à 3:16:48

      Est-ce qu'en plus d'une NullPointerException, tu as une autre exception affichée auparavant ?

      A priori, je pense que ce qui est fait dans ta méthode init() ne fonctionne pas, et envoie une ClassNotFoundException ou SQLException. D'où le fait que c reste à null, et que tu prennes une NullPointer quand tu essaies d'appeler createStatement().


      Maintenant pour parler de ta solution, elle est dangereuse. Déclarer ta Connection en dehors de ta méthode doPost() est risqué, c'est pas du tout ThreadSafe et cet objet se retrouve partagé un peu n'importe comment d'un thread à l'autre. De toute manière, plus généralement ce n'est pas à la servlet de se connecter à la BDD, mais à un objet Java de la couche modèle. Si tu peines encore, d'ici quelques jours le début de la partie 5 de mon cours sera sorti, et devrait t'apporter les réponses.
      • Partager sur Facebook
      • Partager sur Twitter
        31 juillet 2012 à 3:45:34

        Bonsoir Tryle,
        je te propose une autre solution si ça vous tente :
        crée un Package qui porte le nom de resource contenant le fichier ResourceManager.java pour assurant les éventuelles connexion et qui contient le code suivant:
        et n'oublie pas bien sur de faire le build path du jar postgres
        package resource;
        
        
        import java.sql.*;
        public class ResourceManager
        {
        private static String JDBC_DRIVER = "org.postgresql.Driver";
        private static String JDBC_URL =
        "jdbc:postgresql://localhost/Le nom de votre base de donnée";
        private static String JDBC_USER = "Nom user";
        private static String JDBC_PASSWORD = "pass user";
        private static Driver driver = null;
        public static synchronized Connection getConnection()
        throws SQLException
        {
        if (driver == null)
        {
        try
        {
        Class jdbcDriverClass = Class.forName( JDBC_DRIVER );
        driver = (Driver) jdbcDriverClass.newInstance();
        DriverManager.registerDriver( driver );
        }
        catch (Exception e)
        {
        System.out.println( "Failed to initialise JDBC driver" );
        e.printStackTrace();
        }
        }
        return DriverManager.getConnection(
        JDBC_URL,
        JDBC_USER,
        JDBC_PASSWORD
        );
        }
        public static void close(Connection conn)
        {
        try {
        if (conn != null) conn.close();
        }
        catch (SQLException sqle)
        {
        sqle.printStackTrace();
        }
        }
        public static void close(PreparedStatement stmt)
        {
        try {
        if (stmt != null) stmt.close();
        }
        catch (SQLException sqle)
        {
        	sqle.printStackTrace();
        }
        }
        public static void close(ResultSet rs)
        {
        try {
        if (rs != null) rs.close();
        }
        catch (SQLException sqle)
        {
        sqle.printStackTrace();
        }
        }
        }
        


        pour l'appel de l'ouverture ou la fermeture de connexion tu peux faire ainsi :

        import java.sql.Connection;
        import java.sql.PreparedStatement;
        import java.sql.ResultSet;
        import java.sql.SQLException;
        
        import pfe.beans.Utilisateur;
        import pfe.dao.UtilisateurDao;
        import resource.ResourceManager;
        
        public class UtilisateurDaoImpl implements UtilisateurDao{
        	
        	protected java.sql.Connection userConnection;
        	
        
        	public void ajouter_utilisateur(Utilisateur u) throws Exception {
        		// TODO Auto-generated method stub
        		Connection conn = null;
        		PreparedStatement stmt = null;
        		try {
        			if (userConnection != null) {
        				conn = userConnection;
        			} else {
        				conn = ResourceManager.getConnection();
        			}
        			String SQL_INSERT = "INSERT INTO utilisateur  VALUES ( ?,?,?)";
        			stmt = conn.prepareStatement(SQL_INSERT);
        			stmt.setString(1, u.getLogin());
        			stmt.setString(2, u.getPass());
        			stmt.setString(3, u.getCategorie_resp());
        			
        			
        			int rows = stmt.executeUpdate();
        			
        		} catch (Exception _e) {
        			_e.printStackTrace();
        			throw new Exception("Exception: " + _e.getMessage(), _e);
        		} finally {
        			ResourceManager.close(stmt);
        			if (userConnection == null) {
        				ResourceManager.close(conn);
        			}
        		}	
        	}
        }
        
        • Partager sur Facebook
        • Partager sur Twitter
          31 juillet 2012 à 6:20:52

          Le chargement du driver JDBC en Java EE, tu peux tout simplement l'effectuer au chargement de l'appli en le plaçant dans le ServletContext.
          Passer par un singleton pour ça, c'est vraiment pas génial.
          • Partager sur Facebook
          • Partager sur Twitter
            31 juillet 2012 à 8:52:22

            c'est toi l'expert Coyote , je tiendrai compte de ta remarque merci :)
            • Partager sur Facebook
            • Partager sur Twitter

            Java EE et PostgreSQL

            × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
            × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
            • Editeur
            • Markdown