JNDI InitialContext no funciona en un proyecto simple de netbeans

Advertencia: nuevo en Java

Tengo un proyecto simple de Netbeans: quería aprender a interactuar con los DB que provienen de php, pensé que podría probar con uno local que se ejecuta en mi computadora.

Muchos de los ejemplos que existen dicen usar el objeto InitialContext () para referirse al recurso de la base de datos.

Después de seguir los ejemplos, obtengo la siguiente excepción: muchas cosas de Google apuntan a algún archivo .xml, del cual no tengo idea ni de dónde existe en el proyecto Netbeans. No estoy usando un servidor web en este momento, así que no Tomcat ni nada de eso, solo un programa Java local para hacer esto, sospecho que este podría ser el problema. ¿Alguien podría arrojar algo de luz sobre esto?

Exception thrown javax.naming.NoInitialContextException: Need to specify class name in environment or system property, or as an applet parameter, or in an application resource file:  java.naming.


package learningjava;
import com.mysql.jdbc.jdbc2.optional.*;
import com.mysql.jdbc.Driver;
import java.sql.SQLException;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.naming.*;



public class LearningJava {

    public static void main(String[] args) {

       MysqlDataSource test_db = new MysqlDataSource(); 

       test_db.setServerName("localhost");
       test_db.setDatabaseName("dev");

       try {

            InitialContext test_db_context = new InitialContext();
            test_db_context.bind("jcdb/testdb", test_db);
            MysqlDataSource test_db_datasource = (MysqlDataSource)test_db_context.lookup("testdb");

       } catch (NamingException e) {

           System.out.println("Exception thrown " + e);

       }
        try {

            test_db.getConnection("root","password");

        } catch (SQLException e) {

             System.out.println("Exception thrown " + e);

        }


    }    

}
Respuesta 1

En general, debe comprender que JNDI debe tener un servidor. En un fragmento de código que ha proporcionado, está utilizando una parte _CLIENT_SIDE_ de la tecnología JNDI cuando realiza su búsqueda. Debe haber un servidor JNDI al que se pueda acceder desde su conexión de cliente local. Una vez configurado correctamente, la llamada a la búsqueda debe emitir una conexión con el servidor JNDI y proporcionar una forma de obtener / vincular recursos a ese servidor.

¿Cómo configurar JNDI correctamente?

Por lo general, debe proporcionar un archivo de propiedades que contendrá un nombre de host de este servidor, un puerto + alguna información específica de implementación.

El servidor JNDI generalmente ya se proporciona cuando usa un servidor de aplicaciones (como JBoss o Web Sphere). Creo que esta es la raíz del malentendido aquí.

Espero que esto ayude

Respuesta: 2

¿podría intentar agregar esto antes de InitialContext test_db_context = new InitialContext();:

System.setProperty(Context.INITIAL_CONTEXT_FACTORY, "org.apache.naming.java.javaURLContextFactory");
System.setProperty(Context.URL_PKG_PREFIXES, "org.apache.naming");

Debe incluir el jar naming-common-4.1.34 y mysql-connector-java-5.1.6 en su classpath

Este ejemplo funciona para mí (¡no está optimizado pero funciona!)

public static void main(String[] args) throws NamingException {
        // Create initial context
        System.setProperty(Context.INITIAL_CONTEXT_FACTORY, "org.apache.naming.java.javaURLContextFactory");
        System.setProperty(Context.URL_PKG_PREFIXES, "org.apache.naming");

        InitialContext ic = new InitialContext();
        ic.createSubcontext("java:");
        ic.createSubcontext("java:comp");
        ic.createSubcontext("java:comp/env");
        ic.createSubcontext("java:comp/env/jdbc");

         MysqlConnectionPoolDataSource mysqlConnectionPoolDataSource = new MysqlConnectionPoolDataSource();
         mysqlConnectionPoolDataSource.setUser("root");
         mysqlConnectionPoolDataSource.setPassword("root");
         mysqlConnectionPoolDataSource.setURL("jdbc:mysql://localhost:3306/test_my_database");

         ic.bind("java:comp/env/jdbc/test", mysqlConnectionPoolDataSource);

    }
Respuesta: 3

Estoy buscando cargar un PDF usando el mecanismo de carga reanudable. Sin embargo, el servidor web está lanzando una excepción 403 que dice: "Los archivos deben cargarse utilizando el mecanismo de carga reanudable". Esta ...

Esta es mi primera publicación, siempre trato de encontrar la solución, pero no la encontré. Necesito copiar una matriz [] [] [] para copiar [] [] [] pero la copia debe ser más larga que la matriz. Escribí esto pero ...

Tengo problemas para analizar un archivo XML en una instancia de documento JDOM usando SAXBuilder. Lanza la siguiente excepción: [Error grave]: 1: 1: el contenido no está permitido en el prólogo. He encontrado y ...

Quiero crear una estructura de datos de lista especial que funcione como una matriz, ya que es como una lista con valores x [0], x [1], ... Cualquier consejo sería muy apreciado. Sé que todo mi código no es perfecto ...