Problemas conexion BDD con spring en java

Hola a todos, soy nuevo en esto de spring y ya estoy teniendo mi primer problema. Lo que pasa es que quiero conectarme a una base de datos utilizando spring, pero me sale un error de NullPointerException, si alguien podría ayudarme. A continuación pongo el código.

Este es mi archivo aplicationContext.xml

 <!------------------------------------------------------------------------------------------------------------>
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="http://www.springframework.org/schema/beans <a href="http://www.springframework.org/schema/beans/spring-beans.xsd">

" title="http://www.springframework.org/schema/beans/spring-beans.xsd">

">http://www.springframework.org/schema/beans/spring-beans.xsd">

</a>  <bean id="connectJDBC" class="PackSpring.ConnectionJDBC">
        <property name="dataSource" ref="dataSource"/>
    </bean>

    <bean id="dataSource" destroy-method="close" class="org.springframework.jdbc.datasource.DriverManagerDataSource">  
         <property name="driverClassName" value="org.hsqldb.jdbcDriver"/>  
        <property name="url" value="jdbc:hsqldb:hsql://localhost:8080/spring"/>
        <property name="username" value="root"/>
       <property name="password" value="root"/>
    </bean>    
</beans>
<!---------------------------------------------------------------------------------------------------------------->

Y este es mi clase de java ConnectionJDBC.java

package PackSpring;

import java.io.IOException;
import java.sql.SQLException;
import java.sql.ResultSet;

import org.springframework.context.ApplicationContext;
import org.springframework.jdbc.core.RowMapper;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.datasource.DriverManagerDataSource;
import org.springframework.web.context.support.WebApplicationContextUtils;

import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.http.*;

public class ConnectionJDBC extends HttpServlet {
        private JdbcTemplate jdbcTemplate;
        private DriverManagerDataSource dataSource = new DriverManagerDataSource();
               
        public void setDataSource(DriverManagerDataSource dataSource) {
                this.dataSource = dataSource;
                this.jdbcTemplate = new JdbcTemplate(this.dataSource);
               
        }

        public int numRow(String username, String password) {
                /********************************************************************/
                int rowCount = jdbcTemplate.queryForInt("select count(*) from admin where (username = ? and password = ?)",new Object[] {username, password} );    
                //Aqui marca el error de NulllPointerException, me imagino que es porque no se conecta correctamente a la BDD
               /*********************************************************************/

                return rowCount;
        }
       
        public void doPost(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {
                ApplicationContext context =    WebApplicationContextUtils.getRequiredWebApplicationContext((getServletContext()));
                String username = request.getParameter("username");
                String password = request.getParameter("password");
                String address="";
               
                if (numRow(username, password)!=0)
                        address="show-menu.jsp";
                else
                        address="invalid.jsp";
               
                address = "/WEB-INF/jsp/" + address;
                RequestDispatcher dispatcher =  request.getRequestDispatcher(address);
                dispatcher.forward(request, response);
        }

}

Opciones de visualización de comentarios

Seleccione la forma que prefiera para mostrar los comentarios y haga clic en «Guardar las opciones» para activar los cambios.
Imagen de ezamudio

simplifica

Creo que no le has agarrado bien la onda a Spring. En el application context puedes definir un JdbcTemplate (o mejor aun un SimpleJdbcTemplate si tienes Java 5+) que use el DataSource, y tu clase simplemente debe recibir ese template.

Por cierto en la definición de dataSource en tu clase estás asignando un DriverManagerDataSource() que va a ser sustituido por el que te pasan después, no tiene caso que hagas eso, mejor nada más declara el campo sin asignarle nada.

Pero el problema de fondo es que tu clase es un servlet. Los servlets no se toman del application context; el contenedor los instancia cuando los necesita. Necesitas leer la documentación de Spring, ahi viene cómo crear un application context en una aplicación web y cómo usarlo desde servlets (segun recuerdo puede ser en el init del servlet, o en el doPost lo puedes obtener indirectamente del request).

Ya cambie mi

Ya cambie mi aplicationContext.xml a:

<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
                <property name="driverClassName" value="oracle.jdbc.driver.OracleDriver"/>
                <property name="url" value="jdbc:oracle:thin:@localhost:8080:spring"/>
                <property name="username" value="root"/>
                <property name="password" value="root"/>
        </bean>

        <bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
                <constructor-arg ref="dataSource"/>
                <!-- <property name="dataSource" ref="dataSource"/> -->
        </bean>
        <bean id="jdbcTemplateDemo" class="PackSpring.ConnectionJDBC">
                <property name="jdbcTemplate" ref="jdbcTemplate"/>
        </bean>

y en mi clase ya cambie el setDataSource por:

public void setJdbcTemplate(JdbcTemplate jdbcTemplate) {
                this.jdbcTemplate = jdbcTemplate;
                }

Así lo encontre en algunos de los ejemplos en Internet, y sigue con el mismo problema.
Voy a checar lo del servlet y continuar leyendo la documentación de Spring. Muchas gracias.
Ojala y ya no tenga que volver a molestarlos, bye.

Imagen de ezamudio

Lee mi primera respuesta

Cuando hagas preguntas aquí, es más útil si lees las respuestas completas. En mi primer post termino diciendo esto:

El problema de fondo es que tu clase es un servlet. Los servlets no se toman del application context; el contenedor los instancia cuando los necesita. Necesitas leer la documentación de Spring, ahi viene cómo crear un application context en una aplicación web y cómo usarlo desde servlets (segun recuerdo puede ser en el init del servlet, o en el doPost lo puedes obtener indirectamente del request).

En otras palabras, si quieres usar tu application context en una aplicación web necesitas hacer ciertas cosas. Dichas cosas se mencionan en la documentación de Spring y por eso decidí no repetirlo aquí (además de que no me lo sé todo de memoria). Pero necesitas poner un par de cosas en el web.xml de tu aplicación y hacer algo en tu servlet para obtener el application context y ahi pedir los beans que necesitas.

Probablemente tampoco leiste bien lo que decía en los ejemplos que encontraste en otro lado. La configuración del DataSource y del JdbcTemplate está bien, así se definen, pero tu problema es a la hora de querer usarlos. Si vas a seguir buscando ejemplos, busca acerca de cómo usar Spring desde servlets porque ese es el problema. Estás definiendo una instancia de tu clase en el application context y esa instancia efectivamente tiene un JdbcTemplate pero esa instancia no es la que se usa cuando invocas el servlet; la instancia que se usa cuando invocas el servlet en tu aplicación web es otra, una creada por el contenedor (tomcat, jboss, lo que sea que estés usando).

LISTO!! PROBLEMA SOLUCIONADO

Disculpe la tardanza es que me puse a leer más sobre spring porque la verdad estaba muy verde en ese tema y asi he conseguido descifrar algunos errores que tenia.
PRIMERO.- Me faltaba agregar a la carpeta "Lib" que esta dentro de de "WEB-INF" el mysql-connector-X.X.jar. Además tambien deben estar las librerias "commons-dbcp-1.2.2.jar, commons-pool.jar", ademas de las ya indispensables spring y commons-logging.
SEGUNDO: El puerto que estaba utilizando no era el correcto, era el 3306, éste se puede encontrar en el archivo "my.ini" que esta en mi caso en "C:\Program Files\MySQL\MySQL Server 5.1".
TERCERO: así quedo mi applicationContext.xml:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="http://www.springframework.org/schema/beans <a href="http://www.springframework.org/schema/beans/spring-beans.xsd">

" title="http://www.springframework.org/schema/beans/spring-beans.xsd">

">http://www.springframework.org/schema/beans/spring-beans.xsd">

</a>            <bean id="dataSource" destroy-method="close" class="org.apache.commons.dbcp.BasicDataSource">
                 <property name="driverClassName" value="com.mysql.jdbc.Driver"/>
         <property name="url" value="jdbc:mysql://localhost:3306/spring"/>
             <property name="username" value="prueba"/>
         <property name="password" value="prueba"/>
    </bean>  

      <bean id="jdbcTemplateDemo" class="PackSpring.Querys">
                <property name="jdbcTemplate" ref="jdbcTemplate"/>
        </bean>
   
    <bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
                <!--  <constructor-arg ref="dataSource" /> -->
                          <property name="dataSource" ref="dataSource"/>    
    </bean>

</beans>

Espero que le sirva a alguien con el mismo problema. Saludos, hasta luego.

Imagen de stigmatillas

Ok todo bien, pero hay que ser un poco Organizados

En mi mas humilde opinion, te recomendaria que organizaras tus clases, digamos empieza por las buenas practicas y organiza tu codigo.
Te paso mi forma de organizar los proyectos a los que estoy acostumbrado (Quiza este mal, No lo se espero su opinion).

- Primero Organiza Tu Jerarquia de Carpetas de Acuerdo a Tu Proyecto Que estes realizando, empieza por los nombre de la organizacion o institucion educativa en tus carpetas. (Paquetes).
-Yo tengo una organizacion de paquetes mas o menos de esta manera en el SRC de tu proyecto
----->MiOrganizacion
----->DAO
----->Exception
----->Services
----->VO (DTO... Etc es libre y a gusto de cada quien)
----->WEB
----->Actions(O Servlets)
----->Forms(Si no gustas usarlos en los archivos de configuracion)
----->Spring(En lo personal lo uso junto con struts)

En el archivo de configuracion de Spring veo que tienes la declaracion explicita de dataSource. Quiza en algun momento si estas en una empresa ellos te proporcionaran el JNDI y solo haras referencia a el con el bean de dataSource.

A que va esto... Pues veo que en un principio tu codigo esta revuelto debes modularizarlo un poco (Spring AOP). En lo personal si estas en un servlet puedes aplicar el aplicationContext para obtener un servicio. Osea que Esos metodos deben de estar declarados en una interfaz y asu vez implementados
Por ejemplo Yo tengo MiServicio.java Es una interfaz Que tiene la declaracion de los metodos usados en el servicio MiServicioImp.java Es la implementacion.
Aqui hago esto por estas sencillas razones.
* El servlet o Action Obtendras o Generaras(Invocando los servicios) la Informacion del Formulario a la Vista y redireccionaras o haras un forward (pensando en struts y spring).
* Cuando invocas un servicio (Que regularmente generas con un ServiceFactory, implementando el patron de diseño Singleton) . Tendras un acceso al metodo que procesara la informacion (llamemosle logica de negocio si tu quieres) Y en este servicio haras todo el procesamiento de tu informacion, por ejemlpo validaciones, consultas actualizacion etc... Sin embargo esta es una capa intermedia en mis proyectos. Por esta razon
+++ En los servicios puedo hacer uso de otras recursos (Por ejemplo Hago invocaciones a WS a traves de clientes, Hago llamados A DAO´s, O arranco procesos)
* Hablando de tu caso cuando creas DAOS, Segun por lo poquito que he leido he tratado de modularizar el DAO es decir identificar procesos completos y nombrar a todas sus operaciones como partes de este proceso por ejemplo. ProduccionDAO que en este caso seria la interfaz y su respectiva clase de implementacion.
*Esta clase Global(Por llamarla de alguna manera, te sirve para identificar las partes del proceso de tu negocio y modularizar). A su vez ProduccionDAO hara uso de otros DAOS (Mas Atomicos por decirlo asi) Y estos tienen que ver con las operaciones con las diferentes tablas que estan involucradas en el proceso. Ojo Esto es cuestion de diseño y practica. O bien Es la propuesta que te haga tu arquitecto.
*Como te comentaba en los DAOS mas internos podras hacer tus operaciones de consulta e insercion Y ojo esto te lo comento para que separeces perfectamente tu codigo, eso que hiciste lo pudiste haber hecho hasta el final y extendiendo de una clase llamada JdbcDaoSupport, donde heredas un metodo llamado
getJdbcTemplate(). ya no es necesario que pases el datasource e inicialices. Esto te lo comento porque apenas estas empezando. O bien puedes usar el SimpleJDBC pero necesitas un poco mas de experiencia (Es cosa de toparte con los tipicos pedos que todos tenemos alguna vez).
* Por ultimo te recomiendo, aunque el frfamework te dice que cachas las excepciones de forma "automatica" que leas la referencia y ves los tipos de excepciones eso con el fin de que puedas cacharlas y clasificarlas por medio de mensajes y estos asu vez tu decidas si los muestras en consola o solo son mensajes para el usuario.

*Esto te lo comento porque por ejemplo hay en Spring una excepcion llamada EmptyResultDataAccessException y tiene que ver con algun Bean que estes solicitando. Convendria por ejemplo cacharla porque en alguna situacion quisieras saber la existencia de algun registro y si obvio no esta te mandara esta excepcion. pero tu por ejemplo si recibes algo asi puedes hacer un tratamiento de esta informacion.

No lo se ESPERO QUE ESTO NOS AYUDE A TODOS Y SI HAY SUGERENCIAS SOLO ACEPTARE LAS CRITICASS CONSTRUCTIVAS.

Saludos !!!!!!!!!!!!!!!!!!!!!!!!!

bin bluid ant

bin
bluid
ant
(u otro)
lib
src
dominio
servicio
cliente
test
(el test debe tener la misma estructura que tu src)
WebContext
WebInf
etc