Java.lang.NullPointerException

Résolu/Fermé
nifertari - 19 juil. 2013 à 11:47
 nifertari - 23 juil. 2013 à 16:36
Bonjour,
désolée de s'infiltrer de cette façon, mais c'est tellement urgent !!!!

en fait, je suis débutante avec spring mvc, et j'utilise en parallèle hibernate, maven et mysql. après avoir lu beaucoup de documentation je me suis mise à faire un petit exemple.

j'ai une classe Reglages, interface ReglagesDAO, son implémentation ReglagesDaoImpl, une classe ReglagesService, RegalgesControleur + la configuration du web.xml (DispatcherServlet), reglagesServlet.xml (bean ViewResolver), applicationContext.xml pour les beans (sessionFactory, DataSource, Transaction, ....) et enfin mes pages jsp (index, reglages et result).

j'ai arrivé à afficher la page index qui contient un lien vers une autre page contenant un champs (textArea) où je pouvais écrire et un boutton pour la sauvegarde en base de données. (en utilisant les contrôleurs, @RequestMapping ...).

Mon problème est qu'en cliquant sur bouton envoyer j'obtiens l'exception java.lang.NullPointerException, et j'avais bien compris que ça concernait l'initialisation de la session factory (sachant que j'utilise hibernateTemplate, HibernateDaoSupport). Mais pour la résoudre je sais pas trop quoi faire .


Je vous remercie d'avance

9 réponses

kij_82
Messages postés
4088
Date d'inscription
jeudi 7 avril 2005
Statut
Contributeur
Dernière intervention
30 septembre 2013
856
19 juil. 2013 à 14:27
Bonjour,

Comme toute exception en Java tu dois avoir la trace.
Regarde là afin de savoir où a lieu cette NPE (NullPointerException). A partir du moment où tu sais quel élément est NULL, tu dois pouvoir en déduire plus ou moins ce qui ne va pas selon ta configuration en place.

Si toutefois tu n'arrives pas à progresser dessus, voici ce que tu peux nous poster (afin que l'on puisse concrétement aider):

- Le code des classes d'implémentation
- Le code des configurations (web.xml, spring config, etc.)
- La trace complète de la NPE

0
Bonjour,
Je vous remercie pour votre réponse!!

je vous poste mes codes:

ReglagesDao:

package org.***.****.DAO;

import org.****.****.model.Reglages;
import org.springframework.orm.hibernate3.HibernateTemplate;

public interface ReglagesDAO
{
public void add(Reglages reglages);
}


*************

ReglagesDaoImpl:

package org.****.****.DAOImplementation;

import org.****.****.DAO.ReglagesDAO;
import org.****.****.model.Reglages;
import org.springframework.orm.hibernate3.support.HibernateDaoSupport;

public class ReglagesDAOImpl extends HibernateDaoSupport implements ReglagesDAO
{
@Override
public void add(Reglages reglages) {


getHibernateTemplate().save(reglages);
}

}
******************
ReglagesService:

package org.****.****.Service;

import org.****.****.DAO.ReglagesDAO;
import org.****.****.DAOImplementation.ReglagesDAOImpl;
import org.****.****.model.Reglages;

public class ReglagesService
{
private ReglagesDAO reglagesDao;


public ReglagesDAO getReglagesDao()
{
return reglagesDao;
}


public void setReglagesDao(ReglagesDAO reglagesDao)
{
this.reglagesDao = reglagesDao;
}


public void addReglages(Reglages reglage)
{

//reglagesDao = new ReglagesDAOImpl();
reglagesDao.add(reglage);
}
}

******************
RglagesControleur:

package org.****.****.Controleur;

import javax.servlet.http.HttpServletRequest;

import org.****.****.Service.ReglagesService;
import org.****.****.model.Reglages;
import org.springframework.stereotype.Controller;
import org.springframework.ui.ModelMap;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.servlet.ModelAndView;

@Controller
public class ReglagesControleur
{

private ReglagesService reglagesService;

/**gette/setter**/
public ReglagesService getRegalgeService() {
return reglagesService;
}

public void setRegalgeService(ReglagesService regalgeService) {
this.reglagesService = regalgeService;
}

@RequestMapping(value = "/reglages", method = RequestMethod.GET)
public ModelAndView reglages()
{
return new ModelAndView("reglages", "command", new Reglages());
}
/**cette méthode permet d'ajouter et nous renvoie vers une autre page resultat où seront afficher les valeurs ajoutées.**/

@RequestMapping(value = "/addReglages", method = RequestMethod.POST)
public String addReglages(@ModelAttribute("SpringWeb")Reglages reglages, ModelMap model, HttpServletRequest request)
{
model.addAttribute("requete", reglages.getRequete());

//ReglagesService reglagesService= new ReglagesService();

String requete=request.getParameter("requete");

System.out.println("requete >>> " + requete);

reglages.setRequete(requete);
reglagesService = new ReglagesService();
>>> reglagesService.addReglages(reglages);

//exception pointe sur cette ligne!!!

return "resultReg";
}}
******************
ApplicationContext:

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

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



<!-- contient les informations nécessaires pour se connecter à la base de données et la définition des différents beans, sessionFactory et la TransationManager -->


<!-- Data Source for JDBC Connexion -->

<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource">
<property name="driverClassName"><value>com.mysql.jdbc.Driver</value></property>
<property name="url"><value>jdbc:mysql://localhost:3306/test</value></property>
<property name="username"><value>****</value></property>
<property name="password"><value></value></property>
</bean>

<!-- SessionFactory definition -->

<bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
<property name="dataSource"><ref bean="dataSource" /></property>
<property name="mappingResources">
<list>

<value>reglages.hbm.xml</value>
</list>
</property>
<property name="hibernateProperties">
<props>
<prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop>
<prop key="hibernate.show_sql">true</prop>
</props>
</property>
</bean>

<!-- Transaction definition -->

<bean id="transactionManager"
class="org.springframework.orm.hibernate3.HibernateTransactionManager">
<property name="sessionFactory"><ref bean="sessionFactory"></ref>
</property>
</bean>
<!-- HibernateTemplate -->
<bean id="hibernateTemplate" class="org.springframework.orm.hibernate3.HibernateTemplate">
<property name="sessionFactory"><ref bean="sessionFactory"></ref>
</property>
</bean>

<!-- Beans definition -->


<!-- Reglages -->
<bean id="reglagesService" class="org.****.****.Service.ReglagesService">
<property name="reglagesDao"><ref bean="reglagesDao"></ref>
</property>
</bean>

<bean id="reglagesDao" class="org.****.****.DAOImplementation.ReglagesDAOImpl">
<property name="sessionFactory"><ref bean="sessionFactory"></ref>
</property>
</bean>

</beans>

*****************
web.xml


<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5">
<display-name>FinalProjetEntreeDirecte</display-name>
<welcome-file-list>
<welcome-file>index.html</welcome-file>
<welcome-file>index.htm</welcome-file>
<welcome-file>index.jsp</welcome-file>
<welcome-file>default.html</welcome-file>
<welcome-file>default.htm</welcome-file>
<welcome-file>default.jsp</welcome-file>
</welcome-file-list>

<servlet>
<servlet-name>spring</servlet-name> <!-- DispatcherServlet réparti les tâches entre contrôleurs pour voir qui doit répondre à la requête http -->
<servlet-class>org.springframework.web.servlet.DispatcherServlet </servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/entreeDirecte-servlet.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>spring</servlet-name>
<url-pattern>*.html</url-pattern>
</servlet-mapping>


</web-app>

************************
spring-servlet:

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

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


http://www.springframework.org/schema/context


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


<!-- ce fichier contient seulement les informationssur l'application web, les views, les handlers... -->


<!-- auto-détection des composants -->


<context:component-scan base-package="org.****.*****.Controleur"/>



<bean id="viewResolver"
class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="viewClass"
value="org.springframework.web.servlet.view.JstlView" />
<property name="prefix" value="/WEB-INF/jsp/" />
<property name="suffix" value=".jsp" />
</bean>
</beans>

****************************
page jsp:
index
<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
pageEncoding="ISO-8859-1"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Insert title here</title>
</head>
<body>

<a href="reglages.html">redirection Réglages</a><br>

</body>
</html>
**********************
reglages.jsp


<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
pageEncoding="ISO-8859-1"%>
<%@taglib uri="http://www.springframework.org/tags/form" prefix="form"%>

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Insert title here</title>
</head>
<body>

<form:form method="POST" action="addReglages.html">
<h4>Filtrer les Informations</h4>
<TABLE>
<TR>
<td><TEXTAREA name="requete" rows=10 COLS=40>Entrer la Requête !!</TEXTAREA>
</td>
</TR>

<TR>
<TD COLSPAN=2><INPUT type="submit" value="Redirection To Message-Q">
</TD>
</TR>


</TABLE>
</form:form>
</body>
</html>
***************
resultRag.jsp
<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
pageEncoding="ISO-8859-1"%>
<%@taglib uri="http://www.springframework.org/tags/form" prefix="form"%>

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Insert title here</title>
</head>
<body>
<table>
<tr>
<td>requete</td>
<td>${requete}</td>
</tr>
</table>
<a href="index.jsp">Retour vers Index</a>

</body>
</html>
*********************
et en fin voila la stackTrace:

requete >>> select * from reglages
22 juil. 2013 11:08:26 org.apache.catalina.core.StandardWrapperValve invoke
GRAVE: "Servlet.service()" pour la servlet **** a généré une exception
java.lang.NullPointerException
at org.****.****.DAOImplementation.ReglagesDAOImpl.add(ReglagesDAOImpl.java:39)
at org.nmenia.entreeDirecte.Service.ReglagesService.addReglages(ReglagesService.java:28)
at org****.****.Controleur.ReglagesControleur.addReglages(ReglagesControleur.java:49)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at org.springframework.web.bind.annotation.support.HandlerMethodInvoker.invokeHandlerMethod(HandlerMethodInvoker.java:176)
at org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter.invokeHandlerMethod(AnnotationMethodHandlerAdapter.java:440)
at org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter.handle(AnnotationMethodHandlerAdapter.java:428)
at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:925)
at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:856)
at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:936)
at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:838)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:637)
at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:812)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:298)
at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:852)
at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:588)
at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:489)
at java.lang.Thread.run(Unknown Source)
0
kij_82
Messages postés
4088
Date d'inscription
jeudi 7 avril 2005
Statut
Contributeur
Dernière intervention
30 septembre 2013
856
Modifié par kij_82 le 23/07/2013 à 11:05
Hello,

Tes fichiers de configuration m'ont l'air bon d'un premier coup d'oeil.

Clairement tu as une nullPointerException lorsque tu utilise le Hibernate dans ton implémentation de DAO. Je pense qu'il y a donc un soucis d'injection, ou plutôt d'utilisation de ta part puisque la config semble correcte.

Par exemple dans ton controller, tu as un champ private:
private ReglagesService reglagesService; 


Mais:
- tu ne l'utilise pas dans tes méthodes web
- comme tu n'as pas déclarer ton controller dans la config XML (il est retrouvé dynamiquement), tu dois par contre spécifié à spring que ta property 'reglagesService' est un bean à injecter. Pour ce faire utilise l'annotation @Autowired.
- Ne jamais faire de new pour créer / récupérer un bean managé par spring, ça ne fonctionnera pas ! Explication ci-dessous.

Dans ton controller à un moment tu fais ceci:
reglagesService = new ReglagesService(); 

Le résultat de cette ligne est l'instanciation d'un nouvel object ReglagesService via son contructeur sans paramètres. En gros les propriétés ne seront pas remplies.
Si tu souhaite récupérer une instance d'un bean configuration spring, il faut toujours passer par le context spring afin qu'il te retourne un proxy de ce bean.
Pour ce faire, deux méthodes:
- Soit tu ajoutes une propriété privée comme tu as fais, et tu ajoute une annotation @Autowired dessus (avec éventuellement le nom du bean pour plus de précision)
- Soit tu fais implémenter ta classe par l'interface permettant de récupérer le context spring, et ainsi utilisé ce context pour récupérer un proxy de ton bean.

Le plus simple dans ton cas est d'ajouter les annotations pour que spring se débrouille avec.

Exemple:
@Autowired
private ReglagesService reglagesService; 


Personnellement lorsque je travaillais avec Spring, j'effectuais toujours la configuration via les annotations, plus simple, plus rapide, mieux maintenable, plus clair pour les développeurs ne connaissant pas les services (puisque pas besoin de plonger dans des fichiers XML de 15000 lignes. Après pour certaines raisons en entreprise il est bon d'avoir un mixte des deux (ce que tu as), mais il faut correctement utiliser la configuration.

Essai d'ajouter les @Autoriwed sur les beans à injecter dans tes controllers, services et DAO. De même, je rajouterai tout de même les annotations de déclarations tels que @Service et @Repository sur tes services / Dao, bien que la configuration XML ré-écrasera cette pré-configuration.


~ N'oubliez pas la balise "Résolu" lorsque votre problème est... résolu :) ~
0
tksteph
Messages postés
204
Date d'inscription
samedi 20 mars 2010
Statut
Membre
Dernière intervention
3 janvier 2018
25
23 juil. 2013 à 11:05
Bonjour vérifies à la ligne 49 de la classe ReglageControlleur et rassure toi que toutes les variables qui s'y trouvent sont initialisées
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Bonjour,
Je vous remercie pour votre réponse, et Kij_82 pour votre patience :).

j'ai fais comme tu me l'a indiquer, l'exception a disparue mais j'au eu cette erreur!!!

Je vais essayer de le résoudre toute seule sinon je reviendrai vers vous !!!

Je vous remercie
Bonne journée :)

java.lang.IllegalArgumentException: Property 'sessionFactory' is required

org.springframework.orm.hibernate3.HibernateAccessor.afterPropertiesSet(HibernateAccessor.java:314)
org.springframework.orm.hibernate3.HibernateTemplate.<init>(HibernateTemplate.java:139)
org.springframework.orm.hibernate3.support.HibernateDaoSupport.createHibernateTemplate(HibernateDaoSupport.java:82)
org.nmenia.entreeDirecte.DAOImplementation.ReglagesDAOImpl.add(ReglagesDAOImpl.java:40)
org.nmenia.entreeDirecte.Service.ReglagesService.addReglages(ReglagesService.java:29)
org.nmenia.entreeDirecte.Controleur.ReglagesControleur.addReglages(ReglagesControleur.java:50)
sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
java.lang.reflect.Method.invoke(Unknown Source)
org.springframework.web.bind.annotation.support.HandlerMethodInvoker.invokeHandlerMethod(HandlerMethodInvoker.java:176)
org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter.invokeHandlerMethod(AnnotationMethodHandlerAdapter.java:440)
org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter.handle(AnnotationMethodHandlerAdapter.java:428)
org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:925)
org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:856)
org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:936)
org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:838)
javax.servlet.http.HttpServlet.service(HttpServlet.java:637)
org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:812)
javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
0
kij_82
Messages postés
4088
Date d'inscription
jeudi 7 avril 2005
Statut
Contributeur
Dernière intervention
30 septembre 2013
856
Modifié par kij_82 le 23/07/2013 à 12:51
Dans ton DAO, essaie voir d'overwritter la méthode 'setSessionFactory()'.

avec un truc du style:
@Overwrite
void setSessionFactory(SessionFactory sessionFactory){
    this.sessionFactory = sessionFactory;
}


Sinon pour être certain du type d'erreur, regarde les traces de démarrage et vérifie que ton implémentation de DAO soit bien initialisé (genre qu'il n'y ai pas de trace de type "cannot populate property sessionFactory... etc."

Sinon le problème vient peut-être du fait que la factory définie dans ta configuration ne soit pas du type attendu par la méthode setSessionFactory, et donc la property 'sessionFactory' n'est pas populate par ton bean configuré dans l'xml. Si c'est le soucis, un changement du temps d'implémentation de ta sessionFactory devrait résoudre ça.


~ N'oubliez pas la balise "Résolu" lorsque votre problème est... résolu :) ~
0
bonjour,
merci pour le retour, mais ça marche toujours pas !!!!!

je sais plus quoi faire, et ça m'a pris bcp bcp de temps.

en ce moment j'ai refais un autre exemple espérant qu'il fonctionnera !!
0
kij_82
Messages postés
4088
Date d'inscription
jeudi 7 avril 2005
Statut
Contributeur
Dernière intervention
30 septembre 2013
856
23 juil. 2013 à 16:35
Remet ton code mis à jour stp (entre balise code !)

Merci
0
Bonjour,

Je suis soulagée, j'ai refais un exemple et ça fonctionne très bien, j'ai arrivé à insérer en base de données youpiiiiiiiiiiiii trop contente :)

Je vous remercie pour votre aide et votre temps.

Bonne continuation
Cordialement
Nadjah.
0