Ciao, sono nuovo in Spring. Sto sviluppando un'applicazione in stile MVC che gestisce un repository di servizi. Per ora devo solo listare dei servizi presenti in un database, ma non riesco a connettermi al database utilizzando getSimpleJdbcTemplate. Mi viene data quest'eccezione:

codice:
org.springframework.web.util.NestedServletException: Request processing failed; nested exception is java.lang.NullPointerException
	org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:583)
	org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:501)
	javax.servlet.http.HttpServlet.service(HttpServlet.java:617)
	javax.servlet.http.HttpServlet.service(HttpServlet.java:717)

root cause

java.lang.NullPointerException
	spring.repository.JdbcServiceDao.getServiceList(JdbcServiceDao.java:25)
	spring.service.SimpleServiceManager.getServices(SimpleServiceManager.java:20)
	spring.TestController.handleRequest(TestController.java:30)
	org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter.handle(SimpleControllerHandlerAdapter.java:48)
	org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:875)
	org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:809)
	org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:571)
	org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:501)
	javax.servlet.http.HttpServlet.service(HttpServlet.java:617)
	javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
L'eccezione viene in pratica lanciata in JdbcServiceDao.java alla riga in cui chiamo getSimpleJdbcTemplate.

Riporto web.xml:

codice:
		
	<display-name>Repository Services</display-name>
	
	<context-param>
		<param-name>
			contextConfigLocation
		</param-name>
		<param-value>
			WEB-INF/applicationContext.xml
		</param-value>
	</context-param>
	
	<listener>
		<listener-class>
			org.springframework.web.context.ContextLoaderListener
		</listener-class>
	</listener>
	
	<servlet>
		<servlet-name>spring</servlet-name>
		<servlet-class>
			org.springframework.web.servlet.DispatcherServlet
		</servlet-class>
		<load-on-startup>1</load-on-startup>
	</servlet>
	
	<servlet-mapping>
		<servlet-name>spring</servlet-name>
		<url-pattern>*.htm</url-pattern>
	</servlet-mapping>
	
	<welcome-file-list>
		<welcome-file>index.jsp</welcome-file>
	</welcome-file-list>
	
</web-app>
Ecco applicationContext.xml

codice:
<beans ...
		
	<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
		<property name="driverClassName" value="org.hsqldb.jdbcDriver"/>
		<property name="url" value="jdbc:hsqldb:hsql://localhost"/>
		<property name="username" value="sa"/>
		<property name="password" value=""/>
	</bean>	
		
	<bean id="serviceManager" class="spring.service.SimpleServiceManager">
		<property name="serviceDao" ref="serviceDao"/>
	</bean>
	
	<bean id="serviceDao" class="spring.repository.JdbcServiceDao">
		<property name="dataSource" ref="dataSource"/>
	</bean>
		
</beans>
TestController.java

codice:
package spring;

import org.springframework.web.servlet.mvc.Controller;
import org.springframework.web.servlet.ModelAndView;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

import java.io.IOException;
import java.util.Map;
import java.util.HashMap;

import spring.service.*;

public class TestController implements Controller {

	protected final Log logger = LogFactory.getLog(getClass());
	
	private ServiceManager serviceManager = new SimpleServiceManager();

	public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		
		Map<String, Object> myModel = new HashMap<String, Object>();
		logger.info("Pre getthisservices");
		myModel.put("services", this.serviceManager.getServices());

		return new ModelAndView("service", "model", myModel);
	}
	
	public void setServiceManager(ServiceManager serviceManager) {
		this.serviceManager = serviceManager;
	}
	
}
SimpleServiceManager.java

codice:
package spring.service;

import java.util.List;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

import spring.domain.Service;
import spring.repository.*;

public class SimpleServiceManager implements ServiceManager{

	// private List<Product> products;
	private ServiceDao serviceDao = new JdbcServiceDao();
	protected final Log logger = LogFactory.getLog(getClass());

	public List<Service> getServices() {
		// return services;
		logger.info("Getting services!");
		return serviceDao.getServiceList();
	}

	public void setServiceDao(ServiceDao serviceDao) {
		this.serviceDao = serviceDao;
	}
}
JdbcServiceDao.java

codice:
package spring.repository;

import java.sql.ResultSet;
import java.sql.SQLException;

import java.util.*;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

import org.springframework.jdbc.core.simple.ParameterizedRowMapper;
import org.springframework.jdbc.core.simple.SimpleJdbcDaoSupport;

import spring.domain.Service;

public class JdbcServiceDao extends SimpleJdbcDaoSupport implements ServiceDao {

	/** Logger for this class and subclasses */
	protected final Log logger = LogFactory.getLog(getClass());
	
	public List<Service> getServiceList() {

		logger.info("Getting services!");
		
		return getSimpleJdbcTemplate().query("select id, archivio, nome from ServicePar", new ParameterizedRowMapper<Service>(){
			public Service mapRow(ResultSet rs, int rowNum) throws SQLException {
				Service serv = new Service();
				serv.setId(rs.getInt("id"));
				serv.setArchivio(rs.getString("archivio"));
				serv.setNome(rs.getString("nome"));
				return serv;
			}
		});
	}
	
}
Io credo che l'eccezione venga lanciata perchè il dataSource non viene creato correttamente e getSimpleJdbcTemplate va ad operare su un oggetto nullo. Mi sbaglio? Penso ciò perchè se creo manualmente la connessione con la vecchia logica Jdbc, il tutto funziona e la view mi mostra correttamente i campi del database richiesti:

codice:
public List<Service> getServiceList() {

		logger.info("Getting services!");
		
		List<Service> services = new ArrayList<Service>();
		Service serv = new Service();

		try
		{
			// Load Sun's jdbc-odbc driver
			Class.forName("org.hsqldb.jdbcDriver").newInstance();
		}
		catch (ClassNotFoundException cnfe) // driver not found
		{
			logger.info("Unable to load database driver");
			logger.info(cnfe);
		}
		catch (IllegalAccessException cnfe) // driver not found
		{
			logger.info(cnfe);
		}
		catch (InstantiationException cnfe) // driver not found
		{
			logger.info(cnfe);
		}
		try{
			Connection db_connection = 
			DriverManager.getConnection ("jdbc:hsqldb:hsql://localhost", "sa", "");
			Statement db_statement = db_connection.createStatement();
			ResultSet result = db_statement.executeQuery
			("select id, archivio, nome from ServicePar");
			while (result.next() )
			{
				// Use the getInt method to obtain emp. id
				serv.setId(result.getInt("id"));
				serv.setArchivio(result.getString("archivio"));
				serv.setNome(result.getString("nome"));
				services.add(serv);
			}
		}
		catch(SQLException e)
		{
			logger.info(e);
		}
		
		return services;
		
	}
A questo punto credo solo ci sia un errore nella configurazione del dataSource, dato che sicuramente i parametri per l'accesso al database sono corretti.
Grazie a tutti in anticipo.