IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Spring Java Discussion :

NullPointerException sur bean DAO


Sujet :

Spring Java

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    168
    Détails du profil
    Informations personnelles :
    Localisation : Cameroun

    Informations forums :
    Inscription : Avril 2009
    Messages : 168
    Points : 122
    Points
    122
    Par défaut NullPointerException sur bean DAO
    Bonsoir,

    je reprends ce post parce que le précédent que j'ai écrit ne s'affiche plus:
    je suis novice dans le développement avec Spring. Pour me faire la main, je travaille sur un projet dont les technologies sont les suivantes: Spring, Hibernate, JPA, Tomcat. Actuellement, j'essaie de le déployer sur un serveur tomcat et à chaque fois, j'obtiens un NullPointerException sur le bean qui me permet d'accéder aux données.
    Classe InitializeDAO :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
     
    @Transactional
    public class InitializeDAO {
     
    	@PersistenceContext
    	private EntityManager fieldEM; 
     
    	public InitializeDAO() {
     
    	}
    	public Map<String,String> getRegions() { 
        	final Map<String,String> lRegions = new LinkedHashMap<String, String>();
        	CcRegion r = new CcRegion();
     
        	final Query query = fieldEM.createQuery("select p from Ccion p");
     
     
           for (Object p : query.getResultList()) { 
     
           	r =(CcRegion)p;
     
           	lRegions.put(r.getId(), r.getLibelle());
     
           }
     
            return lRegions;
        }
     
        public  Map<String,Map<String,String>> getVillesByRegion(){
     
        	final Map<String,String> lRegions = getRegions();
     
        	final Map<String,Map<String,String>> lVillesByRegion = new LinkedHashMap<String, Map<String,String>>();
     
        	CcVille v = new CcVille ();
     
        	if(!lRegions.isEmpty()){
     
        		Query query = fieldEM.createQuery("select p from CVle p where p.codeRon =?1");
     
        		for (Entry<String, String> entrySet : lRegions.entrySet()){
        			query.setParameter(1, entrySet.getKey());
        			final Map <String, String> lVilles = new LinkedHashMap<String, String>();
     
        			for (Object p : query.getResultList()) { 
     
        	        	v =(CcVille)p;
        	        	lVilles.put(v.getId(), v.getLibelle());	
        	        }
     
        			lVillesByRegion.put(entrySet.getKey(), lVilles);
        		}
        	}
     
            return lVillesByRegion;
        }
     
    	public EntityManager getFieldEM() {
    		return fieldEM;
    	}
    	public void setFieldEM(EntityManager fieldEM) {
    		this.fieldEM = fieldEM;
    	}
    }
    Pour qu'elle soit instanciée, je l'ai déclarée dans mon fichier applicationContext.xml, voici les déclarations que j'ai rajoutées:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    <!-- transaction 
    	<tx:annotation-driven />-->
    	<tx:annotation-driven transaction-manager="txManager" /> 
      <bean id="txManager" class="org.springframework.orm.jpa.JpaTransactionManager"> 
        <property name="entityManagerFactory" ref="entityManagerFactory" /> 
      </bean>
     
    	<bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
            <property name="dataSource" ref="dataSource" />
            <property name="jpaVendorAdapter"> 
          		<bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter"> 
            		<property name="databasePlatform" value="org.hibernate.dialect.MySQL5InnoDBDialect" /> 
            			<!-- 
            			<property name="showSql" value="true" /> 
            			<property name="generateDdl" value="true" /> 
            			--> 
          		</bean> 
        	</property> 
        </bean>
     
    	<bean id="fInitDAO" class="connect.services.InitializeDAO" /> 
     
    	<!-- datasource -->
    	  <bean id="dataSource" class="org.apache.tomcat.jdbc.pool.DataSource" 
    		destroy-method="close" 
    		lazy-init="false" 
    		p:driverClassName="com.mysql.jdbc.Driver"
    		p:url="jdbc:mysql://xxxxxxxx/yyyyconnectdb"
    		p:username="aaaaaaa" 
    		p:password="bbbbb" 
    		p:initialSize="1" 
    		p:maxActive="50" 
    		p:maxIdle="10" 
    		p:maxWait="1000" 
    		p:defaultAutoCommit="false" 
    		p:removeAbandoned="true" 
    		p:removeAbandonedTimeout="60">
    	</bean>
    Puis je l'ai appelé directement dans la classe où j'en avais besoin, ici, il s'agit de la classe FillData:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    @ManagedBean
    @SessionScoped
    public class FillData implements Serializable{
     
    	/**
             * 
             */
    	private static final long serialVersionUID = 1L;
    	private String fRegion;
    	private String fVille;
     
    	private InitializeDAO fInitDAO;
     
    	private Map<String,String> fRegions = new LinkedHashMap<String, String>();
    	private Map<String,String> fVilles = new LinkedHashMap<String, String>();
     
    	private Map<String,Map<String,String>> fVillesParRegion = new HashMap<String, Map<String,String>>();
     
    	public FillData() {
    		super();
     
    		fRegions = fInitDAO.getRegions();		
    		fVillesParRegion = fInitDAO.getVillesByRegion();
    	}
     
     
    	public String getfRegion() {
    		return fRegion;
    	}
     
    	public void setfRegion(String fRegion) {
    		this.fRegion = fRegion;
    	}
     
    	public String getfVille() {
    		return fVille;
    	}
     
    	public void setfVille(String fVille) {
    		this.fVille = fVille;
    	}
     
    	public Map<String, String> getfRegions() {
    		return fRegions;
    	}
     
    	public void setfRegions(Map<String, String> fRegions) {
    		this.fRegions = fRegions;
    	}
     
    	public Map<String, String> getfVilles() {
    		return fVilles;
    	}
     
    	public void setfVilles(Map<String, String> fVilles) {
    		this.fVilles = fVilles;
    	}
     
    	public Map<String, Map<String, String>> getfVillesParRegion() {
    		return fVillesParRegion;
    	}
     
    	public void setfVillesParRegion(
    			Map<String, Map<String, String>> fVillesParRegion) {
    		this.fVillesParRegion = fVillesParRegion;
    	}
     
    	/***/
    	public void getVillesByRegion(){
    		if(fRegion !=null && !fRegion.equals(""))  
    			fVilles = fVillesParRegion.get(fRegion);  
    	}
     
     
    	public InitializeDAO getfInitDAO() {
    		return fInitDAO;
    	}
     
     
    	public void setfInitDAO(InitializeDAO fInitDAO) {
    		this.fInitDAO = fInitDAO;
    	}
    je joins à mon post, les logs générés à l'éxécution de l'appli (voir en pj)
    Pourrez vous avoir une idée du problème?
    Je vous remercie d'avance pour vos réactions
    Fichiers attachés Fichiers attachés

  2. #2
    Membre du Club
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Septembre 2009
    Messages
    30
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 30
    Points : 56
    Points
    56
    Par défaut
    Salut,

    A voir ton code, tu utilises aussi JSF.

    Tu as un NullPointerException car ta DAO n'est pas injectée, deux solutions pour que ta DAO soit injectée ...

    1) Soit tu injectes par spring...
    - Tu rajoutes <context:component-scan base-package="ton.package.base" /> dans ton applicationContext.xml (si ce n'est pas déjà le cas)
    - Tu annotes ton managed bean de @Component pour qu'il soit géré par Spring
    - Tu annotes ton attribut de la manière suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    @Autowired
    @Qualifier("fInitDAO")
    private InitializeDAO fInitDAO;

    2) Soit tu injectes par JSF... (de tête, à confirmer)
    - Tu rajoutes le resolver d'EL de Spring à JSF (faces-config.xml) : <application><el-resolver>org.springframework.web.jsf.el.SpringBeanFacesELResolver</el-resolver></application>
    - Tu annotes ton attribut de la manière suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    @ManagedProperty(value="#{fInitDAO}")
    private InitializeDAO fInitDAO;

    Flo.
    Il n'y a pas de problème ; il n'y a que des solutions. L'esprit de l'homme invente ensuite le problème.

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    168
    Détails du profil
    Informations personnelles :
    Localisation : Cameroun

    Informations forums :
    Inscription : Avril 2009
    Messages : 168
    Points : 122
    Points
    122
    Par défaut
    bonjour Floww14,

    merci pour ta réaction, j'ai éssayé la 1ere solution.
    Donc, j'ai rajouté le nom du package dans mon fichier applicationContext.xml:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <context:component-scan base-package="kmer.connect.services"/>
    Ensuite, j'ai rajouté @ManagedBean et @Component sur ma classe InitializeDAO:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    @ManagedBean
    @Component
    @Transactional
    public class InitializeDAO
    Enfin, j'ai mis à jour la classe FillData dans laquelle j'ai défini un attribut de type InitializeDAO:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    @ManagedBean
    @SessionScoped
    public class FillData implements Serializable{
     
    	@Autowired
    	@Qualifier("fInitDAO")
    	private InitializeDAO fInitDAO;
    ......
    .......
    Après génération du war et déploiement sur le serveur tomcat, j'obtiens la même erreur à l'appel du champ fInitDAO (NullPointerException)

  4. #4
    Membre du Club
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Septembre 2009
    Messages
    30
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 30
    Points : 56
    Points
    56
    Par défaut
    Quand je disais d'annoter ton managed bean, je parlais de ta classe FillData et non InitializeDAO :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    @ManagedBean
    @SessionScoped
    @Component
    public class FillData implements Serializable{
    
    	@Autowired
    	@Qualifier("fInitDAO")
    	private InitializeDAO fInitDAO;
    ......
    .......

    Pense à revenir en arrière sur ton erreur du coup.

    Citation Envoyé par lekonquerant Voir le message
    Ensuite, j'ai rajouté @ManagedBean et @Component sur ma classe InitializeDAO:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    @ManagedBean
    @Component
    @Transactional
    public class InitializeDAO
    Au passage, attention au package que tu as défini "kmer.connect.services" dans ton application context. Il faut que ta classe FillData soit dans ce package (ou un des sous-packages) pour qu'il soit scanné par Spring.
    Il n'y a pas de problème ; il n'y a que des solutions. L'esprit de l'homme invente ensuite le problème.

  5. #5
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    168
    Détails du profil
    Informations personnelles :
    Localisation : Cameroun

    Informations forums :
    Inscription : Avril 2009
    Messages : 168
    Points : 122
    Points
    122
    Par défaut
    Désolé,
    je n'avais pas bien compris!!!
    j'ai fait les modifs et à l'éxécution , j'obtiens une erreur sur l'instanciation de la classe FillData:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    Caused by: org.springframework.beans.BeanInstantiationException: Could not instantiate bean class [kmer.connect.view.newofferform.FillData]: Constructor threw exception; nested exception is java.lang.NullPointerException
    	at org.springframework.beans.BeanUtils.instantiateClass(BeanUtils.java:163)
    	at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:87)
    	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.instantiateBean(AbstractAutowireCapableBeanFactory.java:1000)
    	... 125 more
    Caused by: java.lang.NullPointerException
    	at kmer.connect.view.newofferform.FillData.<init>(FillData.java:45)
    	at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
    	at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:57)
    	at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
    	at java.lang.reflect.Constructor.newInstance(Constructor.java:526)
    	at org.springframework.beans.BeanUtils.instantiateClass(BeanUtils.java:148)
    	... 127 more
    je déduis que le champ fInitDAO n'a pas été instancié et c'est bizarre parce que j'ai suivi tes explications.

  6. #6
    Membre du Club
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Septembre 2009
    Messages
    30
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 30
    Points : 56
    Points
    56
    Par défaut
    Le problème qu'il te reste concerne ton constructeur ; tu appelles ta DAO dedans, or les injections sont effectuées après la construction de l'objet.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    public FillData() {
    		super();
     
    		fRegions = fInitDAO.getRegions();		
    		fVillesParRegion = fInitDAO.getVillesByRegion();
    }
    Pour parer ce problème, il est possible de définir une méthode post-construction que Spring se charge d'exécuter après l'injection des dépendances.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    public FillData() {
    }
     
    @PostConstruct
    public void postConstruct() {
    		fRegions = fInitDAO.getRegions();		
    		fVillesParRegion = fInitDAO.getVillesByRegion();
    }
    Il n'y a pas de problème ; il n'y a que des solutions. L'esprit de l'homme invente ensuite le problème.

  7. #7
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    168
    Détails du profil
    Informations personnelles :
    Localisation : Cameroun

    Informations forums :
    Inscription : Avril 2009
    Messages : 168
    Points : 122
    Points
    122
    Par défaut
    Merci Floww14 "errare humanum est" et j'ajouterai qu'apprendre de ses erreurs fait grandir.
    ça fonctionne maintenant nickel. Il faut que je comprenne précisément chaque terme que j'ai utilisé pour aboutir au résultat.
    Une fois de plus merci.

  8. #8
    Membre du Club
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Septembre 2009
    Messages
    30
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 30
    Points : 56
    Points
    56
    Par défaut
    Pas de soucis, le forum est là pour apprendre
    Si tu veux une précision sur un point, n'hésites pas à me mp.

    Flo.
    Il n'y a pas de problème ; il n'y a que des solutions. L'esprit de l'homme invente ensuite le problème.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. NullPointerException sur un bean DAO
    Par lekonquerant dans le forum Spring
    Réponses: 2
    Dernier message: 24/10/2014, 18h05
  2. [Framework] NullPointerException sur DAOs injectés
    Par TheVirus2013 dans le forum Spring
    Réponses: 7
    Dernier message: 03/06/2010, 14h05
  3. [Tableau] NullPointerException sur les tableaux
    Par zsoh dans le forum Collection et Stream
    Réponses: 6
    Dernier message: 18/01/2010, 17h42
  4. Filtres successifs sur un DAO.Recordset
    Par timoth dans le forum VBA Access
    Réponses: 5
    Dernier message: 07/03/2008, 13h13
  5. NullPointerException sur un RTPManager?
    Par innosang dans le forum Multimédia
    Réponses: 2
    Dernier message: 30/04/2007, 14h10

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo