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

JPA Java Discussion :

EntityManager, null pointer exception.


Sujet :

JPA Java

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    106
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 106
    Par défaut EntityManager, null pointer exception.
    Bonjour,

    J'ai acheté récemment un livre qui parle de JPA (Cahiers du programmeur : Java EE 5). Je l'ai lu et je voudrais appliquer son fonctionnement sur un projet de test.

    Mon projet consiste à la mise en place d'une page JSP d'authentification. J'ai une base avec une table Utilisateur qui contient login et mot de passe. J'ai donc installé Hibernate tools sur mon Eclipse. J'ai effectué un revers engineering code pour qu'il me génère mes classes entities et bean.

    J'ai ensuite crée une page login avec la mise en place de Struts 2 pour la saisie du login et mot de passe.
    Dans mon Action du formulaire, je veux vérifier que mon mot de passe correspond bien au login. J'ai dans mon UtilisateurBean (généré via Hibernate tools) une méthode authentification qui effectue cette vérification.

    Voici le code de mon UtilisateurEntity :
    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
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
     
    package com.sciencesu.gipid.entity.acteur;
     
    // Generated 25 juin 2009 22:19:09 by Hibernate Tools 3.2.4.GA
     
    import java.io.Serializable;
     
    import javax.persistence.Column;
    import javax.persistence.Entity;
    import javax.persistence.FetchType;
    import javax.persistence.Id;
    import javax.persistence.JoinColumn;
    import javax.persistence.ManyToOne;
    import javax.persistence.Table;
     
    import com.sciencesu.gipid.Exceptions.ExceptionDistante;
     
    /**
     * Utilisateur generated by hbm2java
     */
    @Entity
    @Table(name = "utilisateur", schema = "public")
    public class Utilisateur implements Serializable {
     
    	/**
             * 
             */
    	private static final long serialVersionUID = 1L;
     
    	private int idPersonne;
    	private Client client;
    	private Technicien technicien;
    	private Responsable responsable;
    	private String nomUtilisateur;
    	private String motDePasse;
    	private Boolean actif;
     
    	public Utilisateur() {
    	}
     
    	public Utilisateur(int idPersonne) {
    		this.idPersonne = idPersonne;
    	}
     
    	public Utilisateur(int idPersonne, String nomUtilisateur, String motDePasse,Boolean actif) {
    		this.idPersonne = idPersonne;
    		this.nomUtilisateur = nomUtilisateur;
    		this.motDePasse = motDePasse;
    		this.actif = actif;
    	}
     
    	@Id
    	@Column(name = "id_personne", unique = true, nullable = false)
    	public int getIdPersonne() {
    		return this.idPersonne;
    	}
     
    	public void setIdPersonne(int idPersonne) {
    		this.idPersonne = idPersonne;
    	}
     
    	@Column(name = "nom_utilisateur", length = 10)
    	public String getNomUtilisateur() {
    		return this.nomUtilisateur;
    	}
     
    	public void setNomUtilisateur(String nomUtilisateur) {
    		this.nomUtilisateur = nomUtilisateur;
    	}
     
    	@Column(name = "mot_de_passe")
    	public String getMotDePasse() {
    		return this.motDePasse;
    	}
     
    	public void setMotDePasse(String motDePasse) {
    		this.motDePasse = motDePasse;
    	}
     
    	@Column(name = "actif")
    	public Boolean getActif() {
    		return this.actif;
    	}
     
    	public void setActif(Boolean actif) {
    		this.actif = actif;
    	}
     
    	/**
             * Méthode permettant de vérifier le mot de passe de l'utilisateur.
             * 
             * @param pwd
             * @throws ExceptionDistante
             *             Lève une exception si le password est incorrect.
             */
    	public void verifierMotDePasse(String pPassword) {
    		if (pPassword == null || "".equals(pPassword)) {
    			throw new ExceptionDistante("Invalid password");
    		}
     
    		// The password entered by the customer is not the same stored in
    		// database
    		if (!pPassword.equals(this.motDePasse)) {
    			throw new ExceptionDistante("Passwords doen't match");
    		}
    	}
     
    }
    Voici le code de mon Bean :
    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
     
    package com.sciencesu.gipid.stateless.acteur.utilisateur;
     
    import java.util.logging.Logger;
     
    import javax.ejb.Stateless;
    import javax.ejb.TransactionAttribute;
    import javax.ejb.TransactionAttributeType;
    import javax.persistence.EntityManager;
    import javax.persistence.PersistenceContext;
    import javax.persistence.PersistenceContextType;
    import javax.persistence.Query;
     
    import com.sciencesu.gipid.Exceptions.ExceptionDistante;
    import com.sciencesu.gipid.entity.acteur.Utilisateur;
    import com.sciencesu.gipid.util.Constantes;
     
    @TransactionAttribute(value = TransactionAttributeType.REQUIRED)
    @Stateless(name = "UtilisateurSB", mappedName = "ejb/stateless/Utilisateur")
    public class UtilisateurBean implements UtilisateurLocal, UtilisateurRemote {
     
    	@PersistenceContext(unitName = "gipidPU", type=PersistenceContextType.EXTENDED)
    	private EntityManager entityManager;
     
    	private final String cname = this.getClass().getName();
        private Logger logger = Logger.getLogger(Constantes.LOGGER_STATELESS);
     
        /**
         * Authentification de l'utilisateur
         * 
         * @param transientInstance
         */
        public Utilisateur authentification(String pLogin, String pPassword)
        	throws ExceptionDistante {
    		final String mname = "authentification";
            logger.entering(cname, mname, new Object[]{pLogin,pPassword});
     
     
            // On s'assure de la validité des paramètres
            if (pLogin == null || "".equals(pLogin)) {
                throw new ExceptionDistante("Invalid login");
            }
     
            Query lQuery;
            Utilisateur lUtilisateur;
     
            lQuery = entityManager.createQuery("SELECT u FROM Utilisateur u WHERE u.login=:login");
            lQuery.setParameter("login", pLogin);
            lUtilisateur = (Utilisateur) lQuery.getSingleResult();
     
            if (lUtilisateur != null) {
            	lUtilisateur.verifierMotDePasse(pPassword);
            }
     
            logger.exiting(cname, mname, lUtilisateur);
     
            return lUtilisateur;
    	}
     
     
    }
    Mon soucis consiste à appeler le méthode authentification pour vérifier que le login et mot de passe correspondent :
    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
     
    @EJB
    private UtilisateurLocal mUtilisateurBean;
     
    private boolean estValide(String pLogin, String pPassword) {
     
    		Utilisateur lUtilisateur = null;
     
    		try {
    			lUtilisateur = mUtilisateurBean.authentification(pLogin, pPassword);
    		} catch (ExceptionDistante lExpDist) {
    			lUtilisateur = null;
    		}
    		if (lUtilisateur == null) {
    			return false;
    		} else {
    			mLogin = lUtilisateur.getNomUtilisateur();
    			mPassword = lUtilisateur.getMotDePasse();
    			return true;
    		}		
    	}
    Bon j'ai repris le code du libre et adapté ce dernier mais j'ai le droit à un null pointer exception sur le :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    lUtilisateur = mUtilisateurBean.authentification(pLogin, pPassword);
    Ce qui est normal vu que je ne l'instancie pas... mais ils ne le font pas non plus dans le livre...

    Si je passe par un lookup pour récupérer l'objet ça fonctionne bien mais j'ai un null pointer exception à cette ligne dans le bean :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    lQuery = entityManager.createQuery("SELECT u FROM Utilisateur u WHERE u.login=:login");
    mais si j'ai bien compris ce doit être le serveur qui doit instancié les entity manager et pas nous ?

    Si quelqu'un connaitrait un tuto ou pourrait m'aider à résoudre mon problème ???

    Par avance, merci !

  2. #2
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    75
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Novembre 2006
    Messages : 75
    Par défaut
    Bonjour,

    Je ne suis pas un expert la dedans, mais il te faut peut être créer ton entityManager

    Utilise un EntityManagerFactory.createEntityManager() pour ça.

    Pour récupérer une factory tu peux utiliser ça :
    EntityManagerFactory emf = Persistence.createEntityManagerFactory(persistenceUnitName);

    ++@

  3. #3
    Membre Expert
    Homme Profil pro
    Inscrit en
    Septembre 2006
    Messages
    2 962
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2006
    Messages : 2 962
    Par défaut
    Citation Envoyé par FinalSpirit Voir le message

    Si je passe par un lookup pour récupérer l'objet ça fonctionne bien mais j'ai un null pointer exception à cette ligne dans le bean :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    lQuery = entityManager.createQuery("SELECT u FROM Utilisateur u WHERE u.login=:login");
    mais si j'ai bien compris ce doit être le serveur qui doit instancié les entity manager et pas nous ?

    Si quelqu'un connaitrait un tuto ou pourrait m'aider à résoudre mon problème ???

    Par avance, merci !
    si entityManager est null alors que votre configuration sous-entend que c'est un champ initialisé par "inversion of control",
    vous devez "remonter" pour découvrir pourquoi l'injection ne se fait pas…

    les raisons les plus courantes sont :

    - mauvaise configuration de applicationContext.xml,
    - le "bean" est appelé Bean mais n'a été déclaré comme tel dans applicationContext.xml,
    - une deuxième instance du bean est créé par indavertance en dehors de la création de l'applicationContext, en conséquence n'est pas injectée, et c'est cette instance qui est appelée,
    - vous testez dans JUnit et vos units ne sont pas "context aware",
    etc.

  4. #4
    Membre du Club
    Profil pro
    Inscrit en
    Août 2002
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2002
    Messages : 9
    Par défaut
    As tu déployé ton jar et ton war dans un meme fichier ear?
    Tu utilises l'interface locale de ton bean et si tu ne deploies pas dans un ear je pense que cela peut provoquer cette erreur.

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    106
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 106
    Par défaut
    Citation Envoyé par redsonic Voir le message
    Bonjour,

    Je ne suis pas un expert la dedans, mais il te faut peut être créer ton entityManager

    Utilise un EntityManagerFactory.createEntityManager() pour ça.

    Pour récupérer une factory tu peux utiliser ça :
    EntityManagerFactory emf = Persistence.createEntityManagerFactory(persistenceUnitName);

    ++@
    D'accord mais le but est de ne pas passer par un EntityManagerFactory et de laisser le serveur d'application faire le boulot.

    Citation Envoyé par JeitEmgie Voir le message
    si entityManager est null alors que votre configuration sous-entend que c'est un champ initialisé par "inversion of control",
    vous devez "remonter" pour découvrir pourquoi l'injection ne se fait pas…

    les raisons les plus courantes sont :

    - mauvaise configuration de applicationContext.xml,
    - le "bean" est appelé Bean mais n'a été déclaré comme tel dans applicationContext.xml,
    - une deuxième instance du bean est créé par indavertance en dehors de la création de l'applicationContext, en conséquence n'est pas injectée, et c'est cette instance qui est appelée,
    - vous testez dans JUnit et vos units ne sont pas "context aware",
    etc.
    Déjà je n'ai pas de applicationContext.xml. Celui ci est utile lorsque l'on utilise Spring ? Je n'utilise pas SPring (ou plutôt le livre n'en fait aucune référence). Suis je obligé de l'utiliser ?

    Citation Envoyé par aucean Voir le message
    As tu déployé ton jar et ton war dans un meme fichier ear?
    Tu utilises l'interface locale de ton bean et si tu ne deploies pas dans un ear je pense que cela peut provoquer cette erreur.
    Oui, jar et war dans l'ear.

    Merci pour vos réponses

    Je continue mes recherches de mon coté mais je n'ai pas beaucoup avancé... s'il s'avère que je dois utiliser Spring, je le ferai mais j'aimerai reproduire l'exemple du livre et il n'est nulle part référence à SPring ni de applicationContext.xml.

  6. #6
    Membre Expert
    Homme Profil pro
    Inscrit en
    Septembre 2006
    Messages
    2 962
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2006
    Messages : 2 962
    Par défaut
    vous ne devez pas utiliser Spring si les exemples sur lesquels vous vous basez n'en parlent pas…

    mais le principe reste le même :

    si entityManager est null, c'est que l'initialisation du bean ne se fait pas correctement…

    donc dans votre environnement : remontez vers le composant qui est censé initialiser ce bean…

    (vous n'avez pas de default constructor dans UtilisateurBean : j'ai déjà vu des problèmes "étranges" à cause de cela dans certains contextes*…)

  7. #7
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    106
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 106
    Par défaut
    Je suis parvenu à retirer l'erreur.
    J'ai modifier mon code pour lors de l'appel faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    EntityManagerFactory lEmf = Persistence.createEntityManagerFactory("fges_gipid");
    UtilisateurBean lUtilisateurLocal = new UtilisateurBean(lEmf);
    String login = "toto";
    String password = "tata";
    Utilisateur lUser = new Utilisateur();
    lUser.setActif(true);
    lUser.setNomUtilisateur(login);
    lUser.setMotDePasse(password);
    lUtilisateurLocal.creerUtilisateur(lUser);
    Comme ça lors de l'appel de mon utilisateur Bean je lui passe l'entityManagerFactory
    Par contre maintenant que je n'ai plus d'erreur, je n'ai ni les tables qui se créent dans la base de données, ni les données qui s'insèrent...

    Voici ce que me dis le log :
    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
     
    3 juil. 2009 21:03:23 org.eclipse.persistence.default
    PLUS FIN: JavaSECMPInitializer - initializing org.eclipse.persistence.internal.jpa.deployment.DirectoryArchive@122366e.
    3 juil. 2009 21:03:23 org.eclipse.persistence.session.file:/C:/Tools/glassfishv3/glassfish/domains/gipid/eclipseApps/gipidEAR/fges_gipid_war/WEB-INF/classes/-fges_gipid.properties
    LE PLUS FIN: Begin predeploying Persistence Unit fges_gipid; state Deployed; factoryCount 1
    3 juil. 2009 21:03:23 org.eclipse.persistence.session.file:/C:/Tools/glassfishv3/glassfish/domains/gipid/eclipseApps/gipidEAR/fges_gipid_war/WEB-INF/classes/-fges_gipid.properties
    LE PLUS FIN: End predeploying Persistence Unit fges_gipid; state Deployed; factoryCount 2
    3 juil. 2009 21:03:23 org.eclipse.persistence.session.file:/C:/Tools/glassfishv3/glassfish/domains/gipid/eclipseApps/gipidEAR/fges_gipid_war/WEB-INF/classes/-fges_gipid.properties
    LE PLUS FIN: Begin deploying Persistence Unit fges_gipid; state Deployed; factoryCount 2
    3 juil. 2009 21:03:23 org.eclipse.persistence.session.file:/C:/Tools/glassfishv3/glassfish/domains/gipid/eclipseApps/gipidEAR/fges_gipid_war/WEB-INF/classes/-fges_gipid.properties
    LE PLUS FIN: End deploying Persistence Unit fges_gipid; state Deployed; factoryCount 2
    3 juil. 2009 21:03:23 org.eclipse.persistence.session.file:/C:/Tools/glassfishv3/glassfish/domains/gipid/eclipseApps/gipidEAR/fges_gipid_war/WEB-INF/classes/-fges_gipid.connection
    PLUS FIN: client acquired
    3 juil. 2009 21:03:23 org.eclipse.persistence.session.file:/C:/Tools/glassfishv3/glassfish/domains/gipid/eclipseApps/gipidEAR/fges_gipid_war/WEB-INF/classes/-fges_gipid.transaction
    LE PLUS FIN: PERSIST operation called on: com.sciencesu.gipid.entity.acteur.Utilisateur@1aa57fb.
    Mais dans ma base postgreSQL je n'ai absolument rien qui se crée

    Voici mon persistence.xml :
    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
     
    <?xml version="1.0" encoding="UTF-8"?>
    <persistence version="1.0" xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd">
    	<persistence-unit name="fges_gipid">
    		<jta-data-source>jdbc/gipidDS</jta-data-source>
    		<properties>
    			<property name="eclipselink.jdbc.batch-writing" value="JDBC"/>
    			<property name="eclipselink.logging.logger" value="ServerLogger"/>
    			<property name="eclipselink.logging.level" value="ALL"/>
    			<property name="eclipselink.target-server" value="SunAS9"/>
    			<property name="eclipselink.target-database" value="PostgreSQL"/>
    			<property name="eclipselink.ddl-generation" value="create-tables"/>
    			<property name="eclipselink.ddl-generation.output-mode" value="sql-script"/>
    		</properties>
    	</persistence-unit>
    </persistence>
    Je continu mes recherches mais si jamais quelqu'un voit d'où le problème peut venir, se serait sympa de me le dire

    En tout cas merci pour votre aide JeitEmgie, redsonic et aucean.

    Pour info => J'ai bien mon fichier .ddl de générer avec le code pour créer la base de données.

    EDIT :
    Je viens de voir une chose vraiment interessante !
    J'arrive à récupérer les informations dans la base de données. Lorsque je fais un persist pour créer un nouvel utilisateur, il est bien présent dans Java (si je fais un select juste après il me renvoie les infos modifié) mais par contre dans la base de données ça ne se modifie pas. On dirait qu'il effectue les modife correctement mais ne fais pas le commit ! Que dois je faire ?

  8. #8
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    106
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 106
    Par défaut
    Je suis reparti de zéro et maintenant ça marche

    J'avais sûrement du modifier des paramètres qu'il ne fallait pas en bidouillant un peu partout la première fois

    Merci pour votre aide

    PS : Je n'ai pas utilisé de EntityManagerFactory. Il suffit d'annoter avec @EJB l'attribut de l'interface Local et il se charge de tout (merci EJB 3 )

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

Discussions similaires

  1. [débutant] EntityManager : null pointer exception
    Par mateu34 dans le forum Glassfish et Payara
    Réponses: 3
    Dernier message: 16/02/2009, 21h58
  2. Null pointer Exception pour ma Fenetre
    Par LeXo dans le forum AWT/Swing
    Réponses: 2
    Dernier message: 22/01/2007, 09h17
  3. Null Pointer Exception
    Par gloglo dans le forum Langage
    Réponses: 4
    Dernier message: 20/12/2006, 11h32
  4. [Struts] Null Pointer Exception
    Par n@n¤u dans le forum Struts 1
    Réponses: 1
    Dernier message: 01/08/2006, 13h10
  5. Null Pointer Exception
    Par snouppy dans le forum JBuilder
    Réponses: 3
    Dernier message: 13/06/2006, 21h53

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