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:
L'eccezione viene in pratica lanciata in JdbcServiceDao.java alla riga in cui chiamo getSimpleJdbcTemplate.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)
Riporto web.xml:
Ecco applicationContext.xmlcodice:<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>
TestController.javacodice:<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>
SimpleServiceManager.javacodice: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; } }
JdbcServiceDao.javacodice: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; } }
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: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; } }); } }
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.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; }
Grazie a tutti in anticipo.

Rispondi quotando